我有以下字符串:
<p><b>Born:</b>333<br></p>
我尝试获得文本333
,如:
<b>Born:<'/b>(.)*<br>
但是行不通
.
是字符串中的任意字符,*
表示我们关注重复。括号决定要输出的组。
你已经使用了(.)*
公式,这意味着你只会得到最后一个字符(regex从你的帖子应该输出3
)。如果您想输出整个表达式333
,请尝试使用(.*?)
将所有内容放在一个组中。
请使用此正则表达式,
/<b>Born:<'/b>(.*?)<br>/
这里有一个例子,
$reg = "/<b>Born:<'/b>(.*?)<br>/";
$str = "<p><b>Born:</b>333<br></p>";
$matches = array();
preg_match($reg, $str, $matches);
echo $matches[1]; // 333
下面是的实时演示
你可以尝试这样做:
<?php
$string = "<p><b>Born:</b>333<br></p>";
$extract = preg_replace("#(<p>.*?<'/b>)(.*?)(<br.+>)#", "$2", $string);
var_dump($extract); //<== DISPLAYS::: string '333' (length=3)
您应该避免使用regex解析html,因为这是一种不好的做法(html有太多的陷阱,您没有利用html的结构,当html没有很好地格式化字符串方法停止工作)。方法是使用设计用于解析html的工具。组合DOMDocument/DOMXPath能够构建DOM树并使用XPath语言查询它:
$str = "<p><b>Born:</b> 333<br></p>";
libxml_use_internal_errors(true);
$xp = new DOMXPath(DOMDocument::loadHTML($str));
$result = $xp->evaluate('string(//b[.="Born:"]/following-sibling::text()[1])');
libxml_clear_errors();
echo trim($result);