【问题标题】:regex that matches the text between the tags like p a, br正则表达式匹配标签之间的文本,如 p a, br
【发布时间】:2014-04-22 14:01:40
【问题描述】:

我需要一个正则表达式来匹配 p a、br 等标签之间的文本: Albert Einstein,普林斯顿大学部门主管 普林斯顿执行委员会成员

我有一个 (Preg_match_all) 的模式

$pattern="/<\s*a[^>]++>(.*?)<\s*\/\s*a\s*>/";

但它只给了我hrefs中的文本,

有什么提示吗?谢谢 // 这里是示例源

<p>
    <a href="file.pdf" target="_blank"><b>Albert Einstein</b></a><br>
    Division Head, Princeton<br>
    Member of the Executive Committee of Princeton<br>
    </p>

【问题讨论】:

  • 尝试使用 HTML 解析器。见this answer on a related question
  • 使用 dom 解析器,在你的 php 上很容易
  • 使用 DOM 解析器加载 HTML,初始化 XPath 对象,然后执行foreach ($xpath-&gt;query('//text()') as $node) { echo $node-&gt;nodeValue.PHP_EOL; }

标签: php regex preg-match-all


【解决方案1】:

使用 dom 解析器,您可以获得所需的标签内的值:

<?php
$html='<p>
    <a href="file.pdf" target="_blank"><b>Albert Einstein</b></a><br>
    Division Head, Princeton<br>
    Member of the Executive Committee of Princeton<br>
    </p>';
$dom = new DOMDocument;
$dom->loadHTML($html);
echo "[".$dom->getElementsByTagName('p')->item(0)->nodeValue."]";

您可以更改标签值并查看。

在这里演示:https://eval.in/139559

只要把p的值改成b,就可以得到b标签里面的文字,即[Albert Einstein]

【讨论】:

    【解决方案2】:

    您应该使用 HTML 解析器。如果你真的想要一个正则表达式,你可以使用这个:

    $html = <<<EOF
    <p>
        <a href="file.pdf" target="_blank"><b>Albert Einstein</b></a><br>
         Division Head, Princeton<br>
     Member of the Executive Committee of Princeton<br>
        </p>
    EOF;
    
    preg_match_all('%(?:\s+|<b>)([\w ]+)(?:</b>|<br>)%m', $html, $result, PREG_PATTERN_ORDER);
    for ($i = 0; $i < count($result[1]); $i++) {
        echo $result[1][$i]."\n";
    }
    
    /*
    Albert Einstein
    Princeton
    Member of the Executive Committee of Princeton
    */
    

    http://ideone.com/x8aZdd

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-20
      • 2021-08-24
      • 1970-01-01
      • 2019-03-21
      • 1970-01-01
      • 2015-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多