Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式来查找字符串中的特定单词_Php_Regex - Fatal编程技术网

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
,您想删除管道和方括号吗?请编辑您的问题,根据您提供的输入准确显示您所需的输出。我应该如何获得该正则表达式?这就像我需要的一样,非常感谢!