您好我开始学习php正则表达式并遇到以下问题: 我需要提取$ string中的数字。 我使用的正则表达式返回“NULL”。
$string = 'Clasificación</a> (2194) </li>';
$regex = '/Clasificación</a>((.*?))</li>/';
preg_match($regex , $string, $match);
var_dump($match);
提前致谢。
答案 0 :(得分:4)
你的正则表达式存在三个问题:
((.*?))
并不能按照您的想法行事。它创建了两个捕获组 - 一个嵌套在另一个中。我想,你正试图捕捉括号内的内容。为此,您需要转义(
和)
个字符。表达式将变为:\((.*?)\)
</a>
与数字开头之间有空格 - </a> (2194)
。要忽略空格并仅捕获数字,您需要使用\s
(匹配任何空白字符)。为此,您需要编写\s*\((.*?)\)\s*
。修复所有上述错误后的最终正则表达式如下所示:
$regex = '~Clasificación</a>\s*\((.*?)\)\s*</li>~';
完整代码:
$string = 'Clasificación</a> (2194) </li>';
$regex = '~Clasificación</a>\s*\((.*?)\)\s*</li>~';
preg_match($regex , $string, $match);
var_dump($match);
输出:
array(2) {
[0]=>
string(32) "Clasificación (2194) "
[1]=>
string(4) "2194"
}
答案 1 :(得分:2)
您忘记在正则表达式中/
,因为您使用/
作为分隔符:
$regex = '/Clasificación<\/a>((.*?))<\/li>/';
// ^ delimiter ^^ ^ delimiter
// ^^ / in a string which is escaped
另一种方法是更改分隔符,然后你就不必逃避它:
$regex = '#Clasificación<\/a>((.*?))<\/li>#';
有关详细信息,请参阅PHP documentation。
答案 2 :(得分:2)
你必须逃脱你想要匹配的特殊字符:
$regex = '/Clasificación<\/a> \((.*?)\) <\/li>/'
并且可能希望在重要的地方(取决于您的使用案例)使您的匹配更具体一些
$regex = '/Clasificación<\/a>\s*\(([0-9]+)\)\s*<\/li>/';
允许在(1234)之前或之后的0或更多空格,并且只有在()
中只有数字时才匹配我刚在php中试过这个:
php > preg_match($regex , $string, $match);
php > var_dump($match);
array(2) {
[0]=>
string(30) "Clasificacin</a> (2194) </li>"
[1]=>
string(4) "2194"
}