2016-06-12 87 views
1

我想添加一個類到其中包含阿拉伯文字的所有p標籤。例如:取代所有字符串的出現

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

應該成爲

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

我試圖使用PHP preg_replace功能匹配的模式(阿拉伯語)有以下表現:

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

但是它不工作正常。它有兩個問題

  1. 它只匹配第一段。
  2. 添加一個空的<p>

沙盒Link

+0

如果它不是什麼阿拉伯語? –

+0

@SimonKirsten那麼它應該讓它保持原樣。我編輯了問題中的示例,請參閱。 – sam

回答

3

它只匹配的第一個段落。

這是因爲您添加了最後一個參數,表明您只想替換第一個匹配項。拋開這個觀點。

添加一個空的<p>

這實際上就是原來的<p>您不匹配。只需將其添加到匹配的圖案中,但將其保留在匹配組之外,所以當您替換爲$1時,它將被忽略。

這裏是一個修正版本,也sandbox

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

謝謝,但我在您發佈的沙箱鏈接上看到完全相同的問題。你確定它的正確鏈接? – sam

+0

錯誤的鏈接:這是:http://sandbox.onlinephpfunctions.com/code/747ba3b5676602ba4d0aea787d7d0fb1457b3ffd – trincot

2

你的第一個問題是,你不告訴它匹配<p>,所以也沒有。

您的主要問題是空間不是阿拉伯語。簡單地增加替代,以配合他們解決您的問題:

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

使用DOM文檔和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; 
相關問題