无法从regex获取正确的输出

laawzig2  于 2023-11-20  发布在  其他
关注(0)|答案(2)|浏览(105)

下面是我的正则表达式代码:

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>


我只能得到 * 乔什**而不是整个名字。
我可以问一下在我的代码中添加什么吗?

8xiog9wr

8xiog9wr1#

HTML是结构化数据。这意味着有工具可以解析它。Regex不是这个工作的工具。
http://php.net/manual/en/book.dom.php

juzqafwq

juzqafwq2#

如果您不想使用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

  • 备注:
  • ~用作模式定界符,因此模式中的/ s不需要转义。
  • 模式中的\K表示:“从此处开始全字符串匹配”
  • (?=...)是一个正的lookahead,用于在匹配</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元素返回无标记文本。
手册内容:textContent此节点及其子代的文本内容。
或者,如果您需要隔离第一个出现的元素,该元素的类为info-name,则可以使用XPath:(Demo

$dom = new DOMDocument();
$dom->loadHTML($html);
var_export(
    trim(
        (new DOMXPath($dom))
        ->query('//*[@class="info-name"]')
        ->item(0)
        ->nodeValue
    )
);

相关问题