-1

大家好,我试图了解一下正则表达式的工作原理,并通过一些非常简单的例子,我想我安静地理解了一点。有人让我从 HTML 页面中抓取部分文本。我必须抓住的各个部分都在一个像这样的字符串之间 var x (其中 x 是一个 nuber) = ' text text text 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>";
}

如果我没有错,我是说要抓住以数字、空格、等号、另一个空格、单引号开头并以单引号、空格和分号结尾的文本部分之间的所有内容. 我错了吗?猜我是因为它给了我空数组

4

2 回答 2

2

如果没有您要输入的 html 文件中的一些示例文本,preg_match_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>";
}

我注意到的第一件事是,在for你使用的循环中count($matches[0]),然后在你使用的循环中回显时$matches[1]。虽然在 的情况下不一定是问题,preg_match_all但您为什么不一直使用count($matches[1])呢?

我要问的第二件事是:您是否打开了文件并检索了纯文本?就像是:

$file = file_get_contents('/path/to/file.html'); //For example

好的,现在为您的正则表达式...

[0-9]将匹配单个数字

\s将匹配任何空白字符:SPACE、TAB、NEW_LINE 等。

\=火柴=

\'火柴'

\;火柴;

(.*?)匹配 AND 捕获任何字符零次或多次

注意:正则表达式中的问号很重要,因为它将尽早停止匹配,稍后将详细说明。

往前走

虽然您的正则表达式可以工作并为您提供您想要的东西,但它并不是世界上最容易阅读的东西。

匹配:0 = 'something to be captured in here' ;

您可以使用:/\d = '(.*?)' ;/

没有必要逃避=,';。也是so\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>";
}

关于问号

只是为了澄清一点?以及为什么需要它。

一般来说,正则表达式将尽可能地继续通过源文本,这在某些情况下(包括这个)可能会造成问题。

如果您要使用没有?-(.*)而不是(.*?)- 的正则表达式,那么正则表达式将从第一个X = '一直匹配到最后一个' ;,这将不可避免地包括您计划匹配的几个捕获组。但是,如果您使用?它,它会告诉正则表达式在 (在这种情况下) 的第一个实例处停止' ;

您只需在我的代码' ;末尾添加$string和尝试使用和不使用?.

于 2013-09-10T22:54:46.420 回答
0

谢谢大家的回答,我自己解决了。我无法复制我需要的文本,因为里面全是公司名称、地址、电子邮件和电话号码。我通过复制其中的 html 在线尝试了其中一个正则表达式测试,我注意到我需要的文本部分充满了 \n \n \n 所以我无法捕获它(我不知道我必须添加结束斜杠后的“s”“/”)谢谢长答案,它让我对这个论点有了更多的了解,谢谢!

于 2013-09-12T07:47:52.330 回答