簡體   English   中英

正則表達式在字符串中查找特定單詞

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM