我有一个文本,我希望在该文本中首次出现2个或更多字符串。
文本:
<prod##123456_test_12345##shirt> some more text <prod##123456_test_12345##shirt>
正则表达式:
<prod##(\d*)_(.*?)##(.*?)##(.*?)>
这将匹配整个字符串.. 但我想得到&#34;&lt; prod ## 123456_test_12345 ## shirt&gt;&#34;只要。 (第一场比赛)。
我找到了这个:
(<)(.*?\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);
答案 0 :(得分:1)
看起来你对我有额外的(。*?)##。试试这个:
<prod##(\d*)_(.*?)##(.*?)>
对于编辑中的字符串列表,您可以这样做:
<prod##(\d*)(_(.*?))?##(.*?)>
例如:
# 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"
# }
和
# Using the second string in your list:
preg_match("/<prod##(\d*)(_(.*?))?##(.*?)>/", "<prod##12345678_TEEXT##Some text here##Extra text>", $matches);
var_dump($matches);
# array(5) {
# [0] =>
# string(56) "<prod##12345678_TEEXT##Some text here##Extra text>"
# [1] =>
# string(8) "12345678"
# [2] =>
# string(6) "_TEEXT"
# [3] =>
# string(5) "TEEXT"
# [4] =>
# string(26) "Some text here##Extra text"
# }
答案 1 :(得分:1)
你的正则表达式中有一个多余的组,请尝试:
<prod##(\d*)_(.*?)##(.*?)>