Php REGEX PREG_MATCH_ALL
大家好,我试着了解一下正则表达式是如何工作的,通过一些非常简单的例子,我想我明白了一点。 有人让我从HTML页面抓取部分文本。 我必须抓取的各个部分都在一个字符串之间,这个字符串类似于var x(其中x是一个数字)=‘text’; 所以我试过这样的方法:Php REGEX PREG_MATCH_ALL,php,regex,preg-match-all,Php,Regex,Preg Match All,大家好,我试着了解一下正则表达式是如何工作的,通过一些非常简单的例子,我想我明白了一点。 有人让我从HTML页面抓取部分文本。 我必须抓取的各个部分都在一个字符串之间,这个字符串类似于var x(其中x是一个数字)=‘text’; 所以我试过这样的方法: preg_match_all("/[0-9]\s\=\s\'(.*?)\'\s\;/", $file, $matches); print_r($matches); for ($i = 0; $i < count($matches[0]);
preg_match_all("/[0-9]\s\=\s\'(.*?)\'\s\;/", $file, $matches);
print_r($matches);
for ($i = 0; $i < count($matches[0]); $i++) {
echo $matches[1][$i]."<br>";
}
preg_match_all(“/[0-9]\s\=\s\'(.*?\'\s\;/”,$file,$matches);
打印(匹配项);
对于($i=0;$i”;
}
如果我没有错的话,我是说抓住文本中以数字、空格、等号、其他空格、单引号开头的部分,以及以单引号、空格和分号结尾的部分之间的所有内容。
我错了吗?我猜是因为它给了我一个空数组而没有从html文件中提取一些示例文本,您正在将这些文本馈送到
preg\u match\u all()
我们不可能为您提供一个有效的正则表达式
无论如何,这可能会对你有所帮助
您的代码
preg_match_all("/[0-9]\s\=\s\'(.*?)\'\s\;/", $file, $matches);
print_r($matches);
for ($i = 0; $i < count($matches[0]); $i++) {
echo $matches[1][$i]."<br>";
}
好的,现在来看看你的正则表达式
[0-9]
将匹配单个数字
\s
将匹配任何空白字符,因此:空格、制表符、新行等
\=
匹配=
\'
匹配'
\代码>匹配代码>
(.*)
匹配并捕获任何字符零次或多次
注意:正则表达式中的问号很重要,因为它将尽早停止匹配,稍后将详细说明
向前
虽然你的正则表达式可以工作并给你想要的东西,但它并不是世界上最容易阅读的东西
要匹配:0='此处要捕获的内容'代码>
您可以使用:/\d='(.*)/代码>
无需转义=
,'
和代码>。另外,\d
是[0-9]
的别名,因此可以互换使用(但是\d
的字符更少,更易于阅读)。您也不需要使用\s
,只需键入一个空格即可(除非您特别需要包含前面提到的其他空格字符)
一个例子是:
$string = "some text before 0 = 'captured by regex' ; some text afterwards...";
preg_match_all("/\d = '(.*?)' \;/", $string, $matches);
var_dump($matches);
/**
Output from var_dump
array(2) {
[0]=> array(1) {
[0]=> string(27) "0 = 'captured by regex' ;"
}
[1]=> array(1) {
[0]=> string(19) "captured by regex"
}
}
*/
然后,您可以像这样迭代匹配的文本:
for($i = 0; $i < count($matches[1]); $i++){
echo $matches[1][$i], "<br>";
}
for($i=0;$i”;
}
关于问号
只是为了澄清关于?
的观点,以及为什么需要
一般来说,正则表达式将尽可能在源文本中继续使用,这在某些情况下(包括本例)会造成问题
如果您使用的正则表达式没有?
-(.*)
而不是(.*)
-然后正则表达式将从第一个X='
一直匹配到最后一个';
这将不可避免地包括您计划匹配的几个捕获组。但是,如果您使用?
,它会告诉正则表达式在(本例中)的第一个实例时停止;
您只需将;
添加到我的代码中$string
的末尾,并尝试使用和不使用?
让每个人都知道答案,我自己解决了。
我无法复制我需要的文本,因为上面全是公司的名称、地址、电子邮件和电话号码。
我通过复制里面的html在线尝试了其中一个正则表达式测试,我注意到我需要的文本部分充满了\n\n\n,因此我无法捕获它(我不知道我必须在结束斜杠“/”后添加“s”)
Thnk!你对正则表达式占位符的理解是正确的。如果它适用于你的实际输入,只有你才能知道。你没有在这里显示源代码。
for($i = 0; $i < count($matches[1]); $i++){
echo $matches[1][$i], "<br>";
}