取代所有字符串的出现
问题描述:
我想添加一个类到其中包含阿拉伯文字的所有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);
但是它不工作正常。它有两个问题:
- 它只匹配第一段。
- 添加一个空的
<p>
。
沙盒Link
答
它只匹配的第一个段落。
这是因为您添加了最后一个参数,表明您只想替换第一个匹配项。抛开这个观点。
添加一个空的
<p>
。
这实际上就是原来的<p>
您不匹配。只需将其添加到匹配的图案中,但将其保留在匹配组之外,所以当您替换为$1
时,它将被忽略。
这里是一个修正版本,也sandbox:
$text = preg_replace("~<p>(\p{Arabic}+)~u", "<p class=\"foo\">$1", $string);
答
你的第一个问题是,你不告诉它匹配<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;
如果它不是什么阿拉伯语? –
@SimonKirsten那么它应该让它保持原样。我编辑了问题中的示例,请参阅。 – sam