无法从正则表达式获得正确的输出

时间:2017-08-27 17:41:57

标签: php regex

这是我的正则表达式代码:

Name:<\/h5>.*?<div class="info-name">(.*?)(<a|<\/div|\|)

以下是内容:

<h5>Name:</h5>
<div class="info-name">
Josh Taguibao
</div><a class="t0 profile" >Click to view Profile</a>

我能够获得输出,这是

Josh Taguibao

但是,如果内容发生了类似的变化:

<h5>Name:</h5>
<div class="info-name">
Josh <a href="#tagclan">Taguibao</a>
</div><a class="t0 profile" >Click to view Profile</a>

我只能获得 Josh 而不是全名。

请问我的代码添加了什么?

2 个答案:

答案 0 :(得分:1)

HTML是结构化数据。这意味着有可用于解析它的工具。正则表达式不是这项工作的工具。

http://php.net/manual/en/book.dom.php

答案 1 :(得分:0)

如果您不想使用html解析器(SO社区强烈要求的话),您可以匹配并删除标记:

代码:(PHP Demo)(Pattern Demo

$string='<h5>Name:</h5>
<div class="info-name">
Josh <a href="#tagclan">Taguibao</a>
</div><a class="t0 profile" >Click to view Profile</a>';

echo preg_match('~Name:</h5>.*?<div class="info-name">\s*\K.*?(?=\s*</div|\s*\|)~s',$string,$out)?strip_tags($out[0]):'fail';

输出:

Josh Taguibao

*注:

  • ~用作模式分隔符,因此模式中的/不需要转义。
  • 模式中的
  • \K表示:“从这里开始全字符串匹配”
  • (?=...)是一个积极的前瞻,用于在匹配新行后跟</div|之前停止全字符串匹配(通常我会写(?=\s(?:</div>|\|))但它实际上更简洁的步骤更简洁)
  • 模式末尾的s修饰符/标志允许.(点)另外匹配新行。

现在,DomDocument不是我强大的套装,但是我把这个片段打了一遍,这个片段将对你的示例文本产生影响。 (DomDocument Demo

$html='<h5>Name:</h5>
<div class="info-name">
Josh <a href="#tagclan">Taguibao</a>
</div><a class="t0 profile" >Click to view Profile</a>';

$dom=new DOMDocument; 
$dom->loadHTML($html); 
$name=$dom->getElementsByTagName('div')->item(0)->nodeValue; // or ->textContent
echo trim($name);
// same output as regex method

nodeValuetextContent实际上是相同的(对于这种情况无论如何),因为它们都从div元素返回无标记文本。

  

Manual says textContent 此节点及其后代的文本内容。

(...任何想要教我更好地使用DOMDocument的人都欢迎给我发表评论)