取代所有字符串的出现

问题描述:

我想添加一个类到其中包含阿拉伯文字的所有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

它只匹配的第一个段落。

这是因为您添加了最后一个参数,表明您只想替换第一个匹配项。抛开这个观点。

添加一个空的<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

你的第一个问题是,你不告诉它匹配<p>,所以也没有。

您的主要问题是空间不是阿拉伯语。简单地增加替代,以配合他们解决您的问题:

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

使用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;