正则表达式 - 在包含所有组的字符串中首次出现

时间:2014-10-03 11:28:18

标签: regex

我有一个文本,我希望在该文本中首次出现2个或更多字符串。

文本:

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

正则表达式:

<prod##(\d*)_(.*?)##(.*?)##(.*?)>

这将匹配整个字符串.. 但我想得到"< prod ## 123456_test_12345 ## shirt>"只要。 (第一场比赛)。

我找到了这个:

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

它将匹配第一个字符串,但我想保留我的组以便稍后进行解析。

我在这里创建了一个测试: http://regexr.com/v1?38pmq

我也试过了Regular expression to stop at first match,但我并不完全明白它是如何运作的。

(它适用于PHP)

我真正想要的是解析这个列表:

<prod##12345678##Some text here>

<prod##12345678##Some text here##Extra text>

<prod##12345678##Some text here##Extra text>

<prod##12345678_TEEXT##Some text here>

<prod##12345678_TEEXT##Some text here##Extra text>

<prod##12345678_TEEXT##Some text here##Extra text>

是否可以为此列表创建一个包含组的正则表达式? 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">$3</a>',
                      '<a href="domain.com/$1?test=$1&test2=$1_$2">$3</a>',
                      '<a href="domain.com/$1?test=$3">$2</a>',
                      '<a href="domain.com/$1">$2</a>');
$string = preg_replace($product_reg, $product_rep, $string);

2 个答案:

答案 0 :(得分:1)

看起来你对我有额外的(。*?)##。试试这个:

&lt;prod##(\d*)_(.*?)##(.*?)&gt;

对于编辑中的字符串列表,您可以这样做:

&lt;prod##(\d*)(_(.*?))?##(.*?)&gt;

例如:

# Using the first string in your list:

preg_match("/&lt;prod##(\d*)(_(.*?))?##(.*?)&gt;/", "&lt;prod##12345678##Some text here&gt;", $matches);

var_dump($matches);

# array(5) {
#   [0] =>
#   string(38) "&lt;prod##12345678##Some text here&gt;"
#   [1] =>
#   string(8) "12345678"
#   [2] =>
#   string(0) ""
#   [3] =>
#   string(0) ""
#   [4] =>
#   string(14) "Some text here"
# }

# Using the second string in your list:

preg_match("/&lt;prod##(\d*)(_(.*?))?##(.*?)&gt;/", "&lt;prod##12345678_TEEXT##Some text here##Extra text&gt;", $matches);

var_dump($matches);

# array(5) {
#   [0] =>
#   string(56) "&lt;prod##12345678_TEEXT##Some text here##Extra text&gt;"
#   [1] =>
#   string(8) "12345678"
#   [2] =>
#   string(6) "_TEEXT"
#   [3] =>
#   string(5) "TEEXT"
#   [4] =>
#   string(26) "Some text here##Extra text"
# }

答案 1 :(得分:1)

你的正则表达式中有一个多余的组,请尝试:

&lt;prod##(\d*)_(.*?)##(.*?)&gt;