preg_match, кажется, всегда возвращает 0 совпадений - PullRequest
1 голос
/ 13 ноября 2011

У меня есть следующий шаблон и тема

$pattern = "\[item\s*id=['\"](.*?)['\"]\s*\]";
$subject = "[item id=\"40\"]";

По сути, я хочу получить атрибут id из строки [item id = "30"]

И я проверилмой шаблон и тему на разных сайтах preg_match / preg_match_all, и все они возвращают правильные совпадения.

Однако следующий код, который я написал, всегда возвращает NULL для совпадений.Т, ради бога, выясни, что не так!Пожалуйста, кто-нибудь может подсказать мне, как я могу это сделать?Спасибо

Ответы [ 3 ]

2 голосов
/ 13 ноября 2011

Убедитесь, что вы используете правильные разделители . Кроме того, этот сайт очень полезен при отладке.

2 голосов
/ 13 ноября 2011

Вам не хватает разделителей

Warning: preg_match_all(): Delimiter must not be alphanumeric or backslash in /data/1.php on line 4 NULL 

так $pattern должно выглядеть

$pattern = "~\[item\s*id=['\"](.*?)['\"]\s*\]~"; 

возвращает

array(2) { [0]=> array(1) { [0]=> string(14) "[item id="40"]" } [1]=> array(1) { [0]=> string(2) "40" } } 
1 голос
/ 13 ноября 2011

Попробуйте, скорее, так:

$pattern = '/\[item\s+id=[\'"](.*)[\'"]\s*\]/';

Например:

<?php
$pattern = '/\[item\s+id=[\'"](.*)[\'"]\s*\]/';
$subject = "[item id=\"40\"]";
preg_match_all($pattern, $subject, $matches);
echo $matches[1][0]; # => 40
?>

Вы должны использовать правильные разделители (/…/), и \s+ должно быть более подходящим, чем \s* так что это не соответствует что-то вроде [itemid="2"].

...