2014-10-03 2 views
1

나는이 텍스트에 2 개 이상의 문자열이 처음으로 나옵니다.Regex - 모든 그룹이있는 문자열에서 첫 번째 나타나는 것을 얻으십시오.

텍스트 :

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

정규식 :

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

이 전체 문자열과 일치합니다 .. 하지만 내가 좋아하는 것이 얻을 수있는 "< 자극 ## 123456_test_12345 ## 셔츠 >"만. (첫 경기).

(&lt;)(.*?\w+.*?)(&gt;) 

그것은 첫 번째 문자열과 일치합니다,하지만 난 나중에 분석을 위해 내 그룹을 유지하고 싶습니다 :

나는이 하나 발견했다. 내가 여기 테스트 만든

: http://regexr.com/v1?38pmq

가 나는 또한 Regular expression to stop at first match을 시도했지만 나는 완전히 어떻게 작동하는지 이해하지를 ...

(이것은 PHP위한거야)

내가 정말 이 목록을 구문 분석하려면 다음을 수행하십시오.

&lt;prod##12345678##Some text here&gt; 

&lt;prod##12345678##Some text here##Extra text&gt; 

&lt;prod##12345678##Some text here##Extra text&gt; 

&lt;prod##12345678_TEEXT##Some text here&gt; 

&lt;prod##12345678_TEEXT##Some text here##Extra text&gt; 

&lt;prod##12345678_TEEXT##Some text here##Extra text&gt; 

이 목록에 대해 하나의 정규식을 만들 수 있습니까? 4 개의 다른 것들도 멋질 것입니다.

PHP에서

및 출력 : 당신은 여분을 가지고있는 것처럼

$product_reg = array ('/&lt;prod##(\d*)_(.*?)##(.*?)##(.*?)&gt;/', 
         '/&lt;prod##(\d*)_(.*?)##(.*?)&gt;/', 
         '/&lt;prod##(\d*)##(.*?)##(.*?)&gt;/', 
         '/&lt;prod##(\d*)##(.*?)&gt;/'); 
$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); 

답변

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 내 답변과 동일한 답변 :-) – Toto

+0

+1 하둡! 올바른 대답이되어야합니다 :) –

+0

감사! Doh 나는 그것을 지금 본다! 이 질문을 한 후에는 내 질문이 실제로 좀 더 복잡해집니다. 잠시 후에 내 질문이 업데이트 될 것입니다. –

1

정규 표현식에 엄청난 그룹이 있습니다. 시도 :

&lt;prod##(\d*)_(.*?)##(.*?)&gt; 
관련 문제