2016-06-12 24 views
1

Ich möchte eine Klasse zu allen Tags hinzufügen, die arabischen Text darin enthalten. Zum Beispiel:ersetzen alle Vorkommen einer Zeichenfolge

<p>لمبارة وذ</p> 
<p>do nothing</p> 
<p>خمس دقائق يخ</p> 
<p>مراعاة إبقاء 3 لاعبين</p> 

sollten

<p class="foo">لمبارة وذ</p> 
<p>do nothing</p> 
<p class="foo">خمس دقائق يخ</p> 
<p class="foo">مراعاة إبقاء 3 لاعبين</p> 

wird Ich versuche, PHP preg_replace Funktion zu verwenden, um das Muster (arabische) mit folgendem Ausdruck entspricht:

preg_replace("~(\p{Arabic})~u", "<p class=\"foo\">$1", $string, 1); 

aber es nicht funktioniert richtig. Es hat zwei Probleme:

  1. Es passt nur den ersten Absatz.
  2. Fügt eine leere <p> hinzu.

Sandbox Link

+0

Was passiert, wenn es nicht arabisch ist? –

+0

@SimonKirsten dann sollte es so sein wie es ist. Ich habe das Beispiel in der Frage bearbeitet, siehe bitte. – sam

Antwort

3

Es passt nur den ersten Absatz.

Dies liegt daran, dass Sie das letzte Argument hinzugefügt haben, um anzuzeigen, dass Sie nur das erste Vorkommen ersetzen möchten. Lass dieses Argument aus.

Fügt eine leere <p> hinzu.

Dies ist in der Tat das Original <p>, die Sie nicht übereinstimmten. Fügen Sie es einfach zu dem passenden Muster hinzu, aber halten Sie es außerhalb der passenden Gruppe, so wird es weggelassen, wenn Sie mit $1 ersetzen. Hier

ist eine korrigierte Version, auch auf sandbox:

$text = preg_replace("~<p>(\p{Arabic}+)~u", "<p class=\"foo\">$1", $string); 
+0

Danke, aber ich sehe genau die gleichen Probleme auf dem Sandbox-Link, den Sie gepostet haben. Sind Sie sicher, dass der Link korrekt ist? – sam

+0

falscher Link: das ist es: http://sandbox.onlinephpfunctions.com/code/747ba3b5676602ba4d0aea787d7d0fb1457b3ffd – trincot

2

Ihr erstes Problem ist, dass Sie es nicht erzählten die <p> übereinstimmen, so ist es nicht.

Ihr Hauptproblem ist, dass Leerzeichen nicht Arabisch sind. Einfach die alternative Zugabe von ihnen beheben Ihr Problem zu passen:

$text = preg_replace("~<p>(\p{Arabic}*|\s*)~u", "<p class=\"foo\">$1", $string); 
2

Mit DOMDocument und DOMXPath:

$html = <<<'EOD' 
<p>لمبارة وذ</p> 
<p>خمس دقائق يخ</p> 
<p>مراعاة إبقاء 3 لاعبين</p> 
EOD; 

libxml_use_internal_errors(true); 

$dom = new DOMDocument; 
$dom->loadHTML('<div>'.$html.'</div>', LIBXML_HTML_NOIMPLIED); 

$xpath = new DOMXPath($dom); 

// here you register the php namespace and the preg_match function 
// to be able to use it in the XPath query 
$xpath->registerNamespace("php", "http://php.net/xpath"); 
$xpath->registerPhpFunctions('preg_match'); 

// select only p nodes with at least one arabic letter 
$pNodes = $xpath->query("//p[php:functionString('preg_match', '~\p{Arabic}~u', .) > 0]"); 

foreach ($pNodes as $pNode) { 
    $pNode->setAttribute('class', 'foo'); 
} 

$result = ''; 
foreach ($dom->documentElement->childNodes as $childNode) { 
    $result .= $dom->saveHTML($childNode); 
} 

echo $result; 
Verwandte Themen