Я хочу сохранить слово перед второй запятой в строке.
Итак, если строка выглядит следующим образом: Здравствуйте, меня зовут Дэвид, бла-бла.
Я хочу установить переменную $ test = David
^[^,]*,[^,]*\b(\w+)\b,
^ - начало строки / строки [^ ] - Любой персонаж не является ... , - ... запятая * - ноль или более предшествующих , - запятая [^,]* - Опять же, любой символ, не являющийся запятой, повторяется ноль или более раз \b - граница слова (нулевая ширина) ( ) - группа захвата \w - любой символ слова + - один или несколько из предыдущих \b - граница слова (нулевая ширина) , - запятая
^
[^ ]
,
*
[^,]*
\b
( )
\w
+
Ваше регулярное выражение может выглядеть примерно так:
^[^,]*,[^,]*\b(\w+),
Соответствует любой последовательности не запятых, за которой следует первая запятая, за которой следуют дополнительные не запятые, затем граница слова и ваше действительное слово, а затем вторая запятая.
это веб-инструмент, имя которого txt2re
Хокей, я знаю, что это старо, но я тренируюсь ...
Как насчет /,.*?(\w+),/?
/,.*?(\w+),/
У этого превосходного инструмента есть сохраненное объяснение: http://regex101.com/r/yA4gN5
.*?
(\w+)
\w+
Это регулярное выражение (и некоторые из вышеприведенных) завершается неудачей, если Дэвид вводит несловесный символ после своего имени, поэтому «Дэвид!» И «Дэвид» оба терпят неудачу.
А вот и мой подход:
<?php $input = 'Hello, my name is David, bla bla.'; $tmp = substr( $input, 0, strpos( $input, ',', strpos( $input, ',' ) + 1 ) ); $word = substr( $tmp, strrpos( $tmp, ' ' ) + 1 ); echo $word; ?>
$s = "Hello, my name is David, bla bla."; $s = explode(',', $s); $s = explode(' ', $s[1]); $test = $s[sizeof($s)-1]; print $test; 'David'
<?php $s = "Hello, my name is David, bla bla."; preg_match ( "/[^,]*,[^,].* ([^,].*),.*/" , $s, $matches ); // or shorter .. preg_match ( "/[^,]*,[^,]*\b(\w+),/" , $s, $matches ); echo $matches[1]; // => David ?>