Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.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 REGEX PREG_MATCH_ALL_Php_Regex_Preg Match All - Fatal编程技术网

Php REGEX PREG_MATCH_ALL

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]);

大家好,我试着了解一下正则表达式是如何工作的,通过一些非常简单的例子,我想我明白了一点。 有人让我从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]); $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>";
}