2017-01-18 2 views
1

Этот код работает успешно. $ array [1] возвращает имя столбца.Php несколько разных regexp

//My String 
$string = '<input value="{#Quantity#}" type="number" />'; 
preg_match_all('/{#(.*)#\}/i', $text, $array); 
print_r($array); 
/* 
Returned : 
Array 
(
    [0] => Array 
     (
      [0] => {#Quantity#} 
     ) 

    [1] => Array 
     (
      [0] => Quantity 
     ) 

) 
*/ 

Но если в тексте больше названия столбца. Это не работает:

$string = '<input value="{#Quantity#}" data-id="{#Id#}" type="number" />'; 
preg_match_all('/{#(.*)#\}/i', $text, $array); 
print_r($array); 
/* 
Returned : 
Array 
(
    [0] => Array 
     (
      [0] => {#Quantity#}" data-id="{#Id#} 
     ) 

    [1] => Array 
     (
      [0] => Quantity#}" data-id="{#Id 
     ) 

) 
*/ 

Я хочу этот массив

Array 
(
    [0] => Array 
     (
      [0] => {#Quantity#}" data-id="{#Id#} 
     ) 

    [1] => Array 
     (
      [0] => Quantity 
      [1] => Id 
     ) 

) 

Как должно быть регулярное выражение? Итак, как я могу исправить эту проблему?

ответ

2

Вы назначаете текст переменной $string, а затем в preg_match_all вы используете $text. Я предполагаю, что это просто опечатка?

Теперь для другой части проблемы. Вы должны использовать не жадный матч. Добавление ? за .* делает матч не жадным - останавливается на коротком матче.

если вы используете preg_match_all('/{#(.*?)#\}/', $string, $array); , тогда $ array должен быть этим. Это то, что вам нужно?

Array 
(
    [0] => Array 
    (
     [0] => {#Quantity#} 
     [1] => {#Id#} 
    ) 

[1] => Array 
    (
     [0] => Quantity 
     [1] => Id 
    ) 

) 
+0

Это хороший ответ, но не является ли «я» -регулярным избыточным в этом выражении? –

+1

https://translate.google.com/#tr/en/eyvallah%20karde%C5%9Fim :) –

+0

В этом простом случае это делает незначительную разницу. Но использование ленивого соответствия - это удар производительности. Смотрите: http://www.regular-expressions.info/repeat.html#lazy для объяснения причин, почему – Luke

1

Используйте RegEx: '/{#([^}]*)#\}/'

вместо многократного сопоставления . (любой символ), вы должны искать [^}] что «любой символ, кроме }», как } где вы хотите, чтобы остановить согласование.

Match 1 
Full match 14-26 `{#Quantity#}` 
Group 1. 16-24 `Quantity` 

Match 2 
Full match 37-43 `{#Id#}` 
Group 1. 39-41 `Id`