2013-07-24 2 views
3

Я пытаюсь получить строку после разделителя до конца строки с PHP и preg_match. Это мои коды:Получить строку после разделителя до конца строки

<?php 
$stringa = <<<EOT 
var1=Ciao 
var2=Variabile 
var3=We 
EOT; 
preg_match("#var2=(.*?)\n#", $stringa, $boh); 
print_r($boh); 
?> 

Это работает, но не для последней строки, если я заменю переменная2 с var3 в регулярном выражении сгенерированный массив будет пустым.

+0

Может кто-то объяснить семантику знака вопроса в '' Я знаю, что '' означает «факультативный», как в '{0,1}' или '(xxx |)', но я никогда не видел, чтобы он использовался после '*'. Это относится ко всему выражению '. *'? Если да, то это не избыточно, так как '*' может совпадать с 0 вхождениями? –

+0

@PeterAlfvin - '' 'может следовать за любым квантором, чтобы сделать этот квантификатор _non-greedy_. (Вы можете найти этот термин.) Короче говоря, он инструктирует квантификатор, чтобы он совпадал с несколькими экземплярами как возможно [в отличие от _в многих случаях как возможно, что является поведением по умолчанию). Например, '*?', '+?', '??', '{2,5}?' - все не жадные версии соответствующих кванторов. –

+0

@ acheong87 - Спасибо! –

ответ

3

Использование Чередование:

#var2=(.*?)(\n|$)# 
     ^^^^ 
+0

+1, Хорошее чистое решение. – naththedeveloper

+0

Спасибо, прежде чем я использовал эту версию, но с [\ n | $] вместо (\ n | $), мой плохой! – Grork

1

Причина заключается в том, что вам нужен перевод строки после того, как «Мы», чтобы соответствовать правильно:

<?php 
$stringa = <<<EOT 
var1=Ciao 
var2=Variabile 
var3=We 

EOT; 
preg_match("#var3=(.*?)\n#", $stringa, $boh); 
print_r($boh); 
?> 
+0

Не существует ли '\ n' после« Мы », потому что« EOT »появляется в следующей строке? Вы хотите сказать, что регулярное выражение будет работать только в том случае, если в конце есть два последовательных '\ n' s? –

+0

Новая линия, используемая для ввода EOT на отдельной строке, не попадает в строку. –

+0

Ах, спасибо. Я предполагаю, что это имеет смысл, так как нет возможности прервать строку без окончания строки. –

3

Использование многострочный режим, модификатор m, так что $ соответствует новой строке или концу строки:

preg_match('#var2=(.*?)$#m', $stringa, $boh); 
0

Вместо того, чтобы использовать точку, вы можете использовать [^\n], что исключает все новые строки: (. *)?

preg_match('~(?<=var3=)[^\n]+~', $stringa, $boh); 
Смежные вопросы