[英]Regex to find specific words inside string
好吧,我正在搜索和測試,但我不知道如何做以下事情:
我有這個文字:
*Intro*
| [C] – [G] – [Am] – [F] – [Dm] – [G]
*VERSE 1*
=[C][G][Am]
=cu{a}nto he esp{e}rado este mo{m}ento
| [F] – [F] – [Dm] – [F] – [Dm] – [G]
我需要找到[]內的所有單詞,但只能從以“|”開頭的行中找到
我知道使用:
^\|.*
將從頭到尾找到這些行,並使用:
\[(.*?)\]
將選擇所有括號及其內容,但我不知道該怎么說
找到這個^\\|.*
並在結果中應用此\\[(.*?)\\]
為什么不一步一步走? 因為我想使用preg_replace用HTML標簽包裝單詞。
我甚至采取了正確的方法嗎?
非常感謝你。
由於您正在處理純文本,因此您可以使用以下正則表達式:
'~(?:\G(?!\A)|^\|)[^][\r\n]*\K\[(.*?)]~m'
請參閱正則表達式演示
細節 :
(?:\\G(?!\\A)|^\\|)
- 上一個匹配的結尾( \\G(?!\\A)
, \\G
匹配字符串的開頭和上一個匹配的結尾,所以第一個位置應該使用負向前瞻(?!\\A)
- 不在字符串的開頭 )或( |
)一行開頭( ^
)后跟一個文字|
( ^\\|
) [^][\\r\\n]*
- 除[
, ]
,CR和LF以外的零個或多個字符(保持在同一行) \\K
匹配重置操作符省略到目前為止匹配的文本 \\[
- 一個[
(.*?)
- 除了換行符之外的任何0 +字符盡可能少到第一個 ]
- 文字]
。 另一種方法是使用帶有正則表達式的preg_replace_callback
,該正則表達式匹配以|
開頭的所有行 並且,一個回調函數內,更換所有的[...]
子。
preg_replace_callback('~^\|.+~m', function ($m) {
return preg_replace('~\[(.*?)]~', '<span class="chord" data-original-title="" title="">'.$m[1]."</span>", $m[0]);
}, $s);
查看PHP演示 :
$s = <<<TXT
*Intro*
| [C] – [G] – [Am] – [F] – [Dm] – [G]
*VERSE 1*
=[C][G][Am]
=cu{a}nto he esp{e}rado este mo{m}ento
| [F] – [F] – [Dm] – [F] – [Dm] – [G]
TXT;
echo preg_replace_callback('~^\|.+~m', function ($m) {
return preg_replace('~\[(.*?)]~', '<span class="chord" data-original-title="" title="">$1</span>', $m[0]);
}, $s);
輸出:
*Intro*
| <span class="chord" data-original-title="" title="">C</span> – <span class="chord" data-original-title="" title="">G</span> – <span class="chord" data-original-title="" title="">Am</span> – <span class="chord" data-original-title="" title="">F</span> – <span class="chord" data-original-title="" title="">Dm</span> – <span class="chord" data-original-title="" title="">G</span>
*VERSE 1*
=[C][G][Am]
=cu{a}nto he esp{e}rado este mo{m}ento
| <span class="chord" data-original-title="" title="">F</span> – <span class="chord" data-original-title="" title="">F</span> – <span class="chord" data-original-title="" title="">Dm</span> – <span class="chord" data-original-title="" title="">F</span> – <span class="chord" data-original-title="" title="">Dm</span> – <span class="chord" data-original-title="" title="">G</span>
您似乎正在瞄准遵循|
方括號之間的子串 或者–
這就是我的模式所做的(帶有可選的尾隨空格):
模式: /([|–] )\\[([^]]+)\\]( ?)/
替換: $1<span class="chord" data-original-title="$2" title="$2">$2</span>$3
PHP實現:( 演示 )
$txt='*Intro*
| [C] – [G] – [Am] – [F] – [Dm] – [G]
*VERSE 1*
=[C][G][Am]
=cu{a}nto he esp{e}rado este mo{m}ento
| [F] – [F] – [Dm] – [F] – [Dm] – [G]';
echo preg_replace('/([|–] )\[([^]]+)\]( ?)/','$1<span class="chord" data-original-title="$2" title="$2">$2</span>$3',$txt);
輸出:
*Intro*
| <span class="chord" data-original-title="C" title="C">C</span> – <span class="chord" data-original-title="G" title="G">G</span> – <span class="chord" data-original-title="Am" title="Am">Am</span> – <span class="chord" data-original-title="F" title="F">F</span> – <span class="chord" data-original-title="Dm" title="Dm">Dm</span> – <span class="chord" data-original-title="G" title="G">G</span>
*VERSE 1*
=[C][G][Am]
=cu{a}nto he esp{e}rado este mo{m}ento
| <span class="chord" data-original-title="F" title="F">F</span> – <span class="chord" data-original-title="F" title="F">F</span> – <span class="chord" data-original-title="Dm" title="Dm">Dm</span> – <span class="chord" data-original-title="F" title="F">F</span> – <span class="chord" data-original-title="Dm" title="Dm">Dm</span> – <span class="chord" data-original-title="G" title="G">G</span>
使用回溯控制動詞來跳過以不是|
的字符開頭的行 :
preg_match_all('~^[^|\v].*\R*(*SKIP)(*F)|\[\K[^]]+~m', $text, $matches);
print_r($matches[0]);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.