Я хочу захватить текст в квадратных скобках в строке html ниже. Но регулярное выражение, которое у меня ниже, не получает изображения «image» и «imagealt» отдельно, а возвращает «изображение» вместо «alt =» [imagealt]. Если я вытащу alt = "[imagealt]" из строки, она вернется, как я ожидал / хочу.
$html = '<h2>[title]</h2> <div class="content"><img src="[image]" alt="[imagealt]" /></div> <div class="content">[text]</div>'; preg_match_all("^\[(.*)\]^",$html,$fields, PREG_PATTERN_ORDER); echo "<pre>"; print_r($fields); echo "</pre>"; Array ( [0] => Array ( [0] => [title] [1] => [image]" alt="[imagealt] [2] => [text] ) [1] => Array ( [0] => title [1] => image]" alt="[imagealt [2] => text ) )
ваше регулярное выражение жадно. вам нужно остановить его, чтобы быть жадным, чтобы делать то, что вы хотите. Узнайте здесь немного о жадности.
Когда матч жадный, он игнорирует первую ситуацию, которая удовлетворяет регулярному выражению и будет продолжать пытаться соответствовать, пока он не будет потреблять столько входных данных, сколько может.
Обычно это связано с добавлением ?
но я не уверен в php, но вы можете попробовать:
preg_match_all("^\[(.*?)\]^",$html,$fields, PREG_PATTERN_ORDER);
preg_match_all("#\[[^\]]*\]#",$html,$fields, PREG_PATTERN_ORDER);
Шаблон ^
используется для отметки начала строки, поэтому я использую #
или |
для разделителя, чтобы избежать путаницы. Кроме того, я использую [^\]*]
вместо .*?
потому что он обязательно остановится, как только он достигнет конца ]
, тогда как вам нужен ленивый модификатор .
и, возможно, даже модификатор m
, чтобы гарантировать, что он захватывает разрывы строк, если ваши атрибуты решили включить их.
использование
preg_match_all("^\[(.*?)\]^",$html,$fields, PREG_PATTERN_ORDER);
Дополнительно ?
означает «не жадный матч», он остановится после того, как будет найдено ]