Regex - получить первое вхождение в строку со всеми группами

У меня есть текст, в котором я хотел бы получить первое вхождение из двух или более строк в этом тексте.

Текст:

<prod##123456_test_12345##shirt> some more text <prod##123456_test_12345##shirt> 
</prod##123456_test_12345##shirt></prod##123456_test_12345##shirt>

регулярное выражение:

Это будет соответствовать всей строке. Но я хотел бы получить только "". (Первый матч).

Я нашел это:

(<)(.*?\w+.*?)(>)

Он будет соответствовать первой строке, но я хотел бы сохранить мои группы для синтаксического анализа позже.

Я создал тест здесь: http://regexr.com/v1?38pmq

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

(это для PHP)

Я действительно хочу разобрать этот список:

Можно ли создать одно регулярное выражение с группами для этого списка? 4 разных были бы также прохладными.

В PHP и выходе:

$product_reg = array ('/<prod##(\d*)_(.*?)##(.*?)##(.*?)>/',
 '/<prod##(\d*)_(.*?)##(.*?)>/',
 '/<prod##(\d*)##(.*?)##(.*?)>/',
 '/<prod##(\d*)##(.*?)>/');
$product_rep = array ('<a href="domain.com/$1?test=$1&test2=$1_$2&$4" target="_blank">$3</a>',
 '<a href="domain.com/$1?test=$1&test2=$1_$2" target="_blank">$3</a>',
 '<a href="domain.com/$1?test=$3" target="_blank">$2</a>',
 '<a href="domain.com/$1" target="_blank">$2</a>');
$string = preg_replace($product_reg, $product_rep, $string);
</prod##(\d*)##(.*?)></prod##(\d*)##(.*?)##(.*?)></prod##(\d*)_(.*?)##(.*?)></prod##(\d*)_(.*?)##(.*?)##(.*?)>
2 ответа

Похоже, у вас есть дополнительный (. *?) ## для меня. Попробуй это:

Для списка строк в вашем редактировании вы можете сделать следующее:

Например:

# Using the first string in your list:

preg_match("/<prod##(\d*)(_(.*?))?##(.*?)>/", "<prod##12345678##some text="" here="">", $matches);

var_dump($matches);

# array(5) {
# [0] =>
# string(38) "<prod##12345678##some text="" here="">"
# [1] =>
# string(8) "12345678"
# [2] =>
# string(0) ""
# [3] =>
# string(0) ""
# [4] =>
# string(14) "Some text here"
# }
</prod##12345678##some></prod##12345678##some></prod##(\d*)(_(.*?))?##(.*?)>

А также:

# Using the second string in your list:

preg_match("/<prod##(\d*)(_(.*?))?##(.*?)>/", "<prod##12345678_teext##some text="" here##extra="">", $matches);

var_dump($matches);

# array(5) {
# [0] =>
# string(56) "<prod##12345678_teext##some text="" here##extra="">"
# [1] =>
# string(8) "12345678"
# [2] =>
# string(6) "_TEEXT"
# [3] =>
# string(5) "TEEXT"
# [4] =>
# string(26) "Some text here##Extra text"
# }
</prod##12345678_teext##some></prod##12345678_teext##some></prod##(\d*)(_(.*?))?##(.*?)>


У вас есть избыточная группа в вашем регулярном выражении, попробуйте:

licensed under cc by-sa 3.0 with attribution.