preg_match字符串中的所有段落

时间:2016-03-15 18:07:47

标签: php regex preg-match

以下字符串包含多个<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);

2 个答案:

答案 0 :(得分:3)

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)

使用SimpleXMLXPath和正则表达式(text()上的正则表达式等)的组合仅支持XPath 2.0)。
步骤:

  1. 首先加载 DOM
  2. 通过xpath查询获取所有p个标记
  3. 如果文本/节点值与正则表达式匹配,请应用css类
  4. 这是实际代码:

    <?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结构。