Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PHP中使用reg表达式获取字符串后的文本?_Php_Regex - Fatal编程技术网

如何在PHP中使用reg表达式获取字符串后的文本?

如何在PHP中使用reg表达式获取字符串后的文本?,php,regex,Php,Regex,我有以下字符串: <p><b>Born:</b>333<br></p> 但它不起作用您可以尝试以下方法: <?php $string = "<p><b>Born:</b>333<br></p>"; $extract = preg_replace("#(<p>.*?<\/b>)(.*?)(<br.+>)#

我有以下字符串:

<p><b>Born:</b>333<br></p>

但它不起作用

您可以尝试以下方法:

<?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)

改用此正则表达式

/<b>Born:<\/b>(.*?)<br>/
/Born:(.*)
/
举个例子

$reg = "/<b>Born:<\/b>(.*?)<br>/";
$str = "<p><b>Born:</b>333<br></p>";
$matches = array();
preg_match($reg, $str, $matches);
echo $matches[1];  // 333
$reg=“/Born:(.*)
/”; $str=“出生:333

”; $matches=array(); 预匹配($reg,$str,$matches); echo$匹配项[1];//333

这里是的
是字符串中的任何字符,
*
表示我们关注重复。括号确定要输出的组


您已经使用了
(.)*
公式,这意味着您将只获得最后一个字符(您文章中的正则表达式应该输出
3
)。如果您想输出整个表达式
333
,请尝试使用
(.*?

将所有内容放在一个组中,您应该避免使用正则表达式解析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);
$str=“出生:333

”; libxml\u使用\u内部错误(true); $xp=newdomxpath(DOMDocument::loadHTML($str)); $result=$xp->evaluate('string(//b[.=“Born:”]/以下同级::text()[1]); libxml_clear_errors(); 回波微调(结果);
它可以工作,但我这里有换行符或空格。333
它可以工作,但我这里有换行符或空格333@Dev嗯,在这种情况下,您需要在正则表达式中指定
\s+
。我相信这会对你有用,
/Born:\s+(.*)
/
。这是现场演示,.s,
\s+
工作错误,因为当没有空格或换行符时,它就不会工作work@Dev哦,我误解了你的字符串格式。使用
\s*
而不是
\s+
。正确的正则表达式应该是,
/Born:\s*(.*)
/
。这是演示,
$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);