以下字符串包含多个<p>
标记。我想将每个<p>
的内容与模式匹配,如果匹配,我想在该特定段落中添加一个css类。
例如,在以下字符串中,只有第二段内容匹配,所以我想只为该段添加一个类。
$string = '<p>para 1</p><p>نص عربي أو فارسي</p><p>para3</p>';
使用以下代码,我可以匹配所有字符串,但我无法弄清楚如何找到特定的段落。
$rtl_chars_pattern = '/[\x{0590}-\x{05ff}\x{0600}-\x{06ff}]/u';
$return = preg_match($rtl_chars_pattern, $string);
答案 0 :(得分:3)
<p>
标记preg_replace
https://regex101.com/r/nE5pT1/1
$str = "<p>para 1</p><p>نص عربي أو فارسي</p><p>para3</p>";
$result = preg_replace("/(<p>)[\\x{0590}-\\x{05ff}\\x{0600}-\\x{06ff}]/u", "<p class=\"foo\">", $str, 1);
答案 1 :(得分:2)
使用SimpleXML
,XPath
和正则表达式(text()
上的正则表达式等)的组合仅支持XPath 2.0
)。
步骤:
p
个标记这是实际代码:
<?php
$html = "<html><p>para 1</p><p>نص عربي أو فارسي</p><p>para3</p></html>";
$xml = simplexml_load_string($html);
# query the dom for all p tags
$ptags = $xml->xpath("//p");
# your regex
$regex = '~[\x{0590}-\x{05ff}\x{0600}-\x{06ff}]~u';
# alternatively:
# $regex = '~\p{Arabic}~u';
# loop over the tags, if the regex matches, add another attribute
foreach ($ptags as &$p) {
if (preg_match($regex, (string) $p))
$p->addAttribute('class', 'some cool css class');
}
# just to be sure the tags have been altered
echo $xml->asXML();
?>
见a demo on ideone.com。该代码的优势在于您只分析p
标记的内容,而不是DOM
结构。