2016-06-13 62 views
2

我有一個字符串,它看起來像這樣如何使用PHP在字符串中查找所有匹配的模式?

Hello, my name is "{{ @sql(SELECT TOP 1 name FROM table1 WHERE [id] = 5) }}" and my title is "{{ @sql(SELECT TOP 1 title FROM table1 WHERE [id] = 5) }}" 

我需要能夠藉此串並分析出了以下模式{{ @sql(WHATEVER QUERY GOES HERE) }}匹配任何模式,必須有兩個braken其次是可選的空間,然後@sql(啓動在) }}

結束。此外,我還需要提取內部查詢這是@sql() }} 這裏結束之間的文本是我做了什麼

$pattern = '/\{\{\s*[email protected]\((.+)\)+\s*+\}\}/i'; 

$matches = []; 

preg_match ($pattern, $subject, $matches, PREG_OFFSET_CAPTURE); 
echo '<pre>'; 
print_r($matches); 
echo '</pre>'; 

我的模式適用於以下字符串

Hello "{{ @sql(SELECT TOP 1 name FROM table1 WHERE [id] = 5) }}" 

但是當我需要的是使用模式不止一次在文中,似乎我的模式搜索的)}}最後一次出現,而不是下一個發生。

如何更新我的模式,以便查找一個或多個匹配項?

謝謝

+0

的[PHP預浸\ _match和預浸\ _match \ _all功能]可能的複製(http://stackoverflow.com/questions/4088836/php-preg-match-and-preg-匹配所有函數) – Devon

+1

你有沒有注意到_None_你的示例字符串是這樣的''{{@sql(SELECT TOP 1 name FROM table1 WHERE [id] = 5}}「'將匹配正則表達式模板,比如'{ {@sql(WHATEVER QUERY GOES HERE)}}'? – sln

+0

爲什麼使用所有格量詞'* +'? – sln

回答

1

在評論經過一番討論後,我想你需要preg_replace()

<?php 
$string = 'Hello, my name is "{{ @sql(SELECT TOP 1 name FROM table1 WHERE [id] = 5) }}" and my title is "{{ @sql(SELECT TOP 1 title FROM table1 WHERE [id] = 5) }}"'; 

$regex = '~ 
      \{{2}\h*@sql\( # start of outer part 
      (?P<query>[^()]+) # inner query 
      \)\h*\}{2}  # end of outer part 
     ~x'; 

$string = preg_replace($regex, '$1', $string); 
echo $string; 
# Hello, my name is "SELECT TOP 1 name FROM table1 WHERE [id] = 5 " and my title is "SELECT TOP 1 title FROM table1 WHERE [id] = 5 " 

?> 

a demo on ideone.com

+0

謝謝你的幫助。是的,我需要內部查詢。我對如何循環結果感到困惑。另外,內部查詢最後給了我一個額外的')' – Jaylen

+0

實際上,我感興趣的是內部查詢,其餘部分我都不在乎。如果僅僅通過完美的內部查詢獲得數組更容易 – Jaylen

+0

現在更有意義。但是查詢仍然會在最後返回一個額外的''''。 – Jaylen

0

你應該只讓正則表達式非gready,加入?

...(.+?)... 

(並且還使用preg_match_all

+0

謝謝你。在我的問題「我將在下一次編輯」中忘記提到的一件事是該模式的第二個索引是提取在'@sql(QUERY)'內部查找的查詢。 – Jaylen

0

我這樣做的一種方式是:你不需要在一對開合支架內使用任何其他支架。所以你可以指定:

[^\{\}]+ 

上述模式將匹配任何不包含大括號的字符串。你完整的模式將是

/\{\{ [email protected]\([^\{\}]+\) ?\}\}/i 
+0

這將返回以{{開始並以}結束}的整個文本。我需要返回的是位於'{{@sql('和')}}'之間的查詢 – Jaylen

相關問題