Php 正则表达式来查找字符串中的特定单词
嗯,我一直在搜索和测试,但我不知道如何执行以下操作: 我有以下案文:Php 正则表达式来查找字符串中的特定单词,php,regex,Php,Regex,嗯,我一直在搜索和测试,但我不知道如何执行以下操作: 我有以下案文: *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] 我需要找到[]中的所有单词,但只能从以“|”开头的行中找到 我知道使用: ^\|.* \[(.*?)\] 将查找从头到尾的行,并使用
*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\u replace用HTML标签包装单词
我是否采取了正确的方法
非常感谢。由于您处理的是纯文本,因此可以在其上使用以下正则表达式:
'~(?:\G(?!\A)|^\|)[^][\r\n]*\K\[(.*?)]~m'
见
详细信息:
-上一个匹配的结尾((?:\G(?!\A)| ^\ |)
,\G(?!\A)
既匹配字符串的开头,也匹配上一个匹配的结尾,因此应使用负前瞻\G
-不在字符串开头)或((?!\A)
)行的开头减去第一个位置(
)后跟文字^
(
)^\
-除[^][\r\n]*
、[
、CR和LF之外的零个或多个字符(保持在同一行)]
-匹配重置运算符忽略到目前为止匹配的文本\K
-a\[
[
-除换行符以外的任何0+字符在第一个字符之前尽可能少(.*)
-文字]
]
preg\u replace\u回调
,该正则表达式匹配以
开头的所有行,并在回调函数中替换所有[…]
子字符串
preg_replace_callback('~^\|.+~m', function ($m) {
return preg_replace('~\[(.*?)]~', '<span class="chord" data-original-title="" title="">'.$m[1]."</span>", $m[0]);
}, $s);
preg_replace_回调('~^\.+~m',函数($m){
返回preg\u replace(“~\[(.*?)]”、“.$m[1]”、$m[0]);
}美元(s),;
见:
$s=看起来您的目标是
或-
后面的方括号之间的子字符串,所以这就是我的模式所做的(带有可选的尾随空格):
模式:/([|-])\[([^]]+)\](?)/
更换:$1$2$3
PHP实现:()
$txt='*简介*
|[C]-[G]-[Am]-[F]-[Dm]-[G]
*第1节*
=[C][G][Am]
=cu{a}to he esp{e}rado este mo{m}ento
|[F]-[F]-[Dm]-[F]-[Dm]-[G]';
echo preg_replace(“/([|–])\[([^]]+)\](?)/”,“$1$2$3',$txt);
输出:
*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>
*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>
*简介*
|C–G–Am–F–Dm–G
*第1节*
=[C][G][Am]
=cu{a}to he esp{e}rado este mo{m}ento
|F–F–Dm–F–Dm–G
使用回溯控制谓词跳过以非|
字符开头的行:
preg_match_all('~^[^|\v].*\R*(*SKIP)(*F)|\[\K[^]]+~m', $text, $matches);
print_r($matches[0]);
html标记都是一样的吗?(比如
和
)请显示您所需的最终结果,包括标记。这是我正在查找的结果C
,您想删除管道和方括号吗?请编辑您的问题,根据您提供的输入准确显示您所需的输出。我应该如何获得该正则表达式?这就像我需要的一样,非常感谢!