正则表达式匹配标签之间的文本,如p a,br

时间:2014-04-22 14:01:40

标签: php regex preg-match-all

我需要一个匹配标签之间的文本的正则表达式,如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>

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

您应该使用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