这是我的正则表达式代码:
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 而不是全名。
请问我的代码添加了什么?
答案 0 :(得分:1)
HTML是结构化数据。这意味着有可用于解析它的工具。正则表达式不是这项工作的工具。
答案 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
nodeValue
和textContent
实际上是相同的(对于这种情况无论如何),因为它们都从div元素返回无标记文本。
Manual says: textContent 此节点及其后代的文本内容。
(...任何想要教我更好地使用DOMDocument的人都欢迎给我发表评论)