如果没有您要输入的 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
和尝试使用和不使用?
.