在PHP中,如果开始分隔符和结束分隔符不同,如何拆分字符串 简介
在PHP中,如何使用以下语法拆分一行:在PHP中,如果开始分隔符和结束分隔符不同,如何拆分字符串 简介,php,regex,string,explode,Php,Regex,String,Explode,在PHP中,如何使用以下语法拆分一行: <As's\\as'dsd> asqwedasd <sa sdasd> [a sadasd] [<asdsad> [as ddsd]] 'asdsad assd' 提前谢谢你! 我知道这是一项艰巨的任务,但我自己却完全不知道该怎么做。关于使用正则表达式解析html的所有免责声明。。。只有当你准备好了一些递归美的时候, 匹配您想要的内容与分割您不想要的内容 在本例中,如果要使用正则表达式来获取数组,那么匹配所需内容将
<As's\\as'dsd> asqwedasd <sa sdasd> [a sadasd] [<asdsad> [as ddsd]] 'asdsad assd'
提前谢谢你!
我知道这是一项艰巨的任务,但我自己却完全不知道该怎么做。关于使用正则表达式解析html的所有免责声明。。。只有当你准备好了一些递归美的时候,
匹配您想要的内容与分割您不想要的内容
在本例中,如果要使用正则表达式来获取数组,那么匹配所需内容将比拆分不需要的内容更容易。这是一个起点,我们可以对其进行改进:
(\[(?:[^[\]]++|(?1))*\])|<[^>]*>|'[^']*'|[!-~]+
另一种解决方案
@哈姆扎想出了另一个解决办法,我觉得很漂亮。他不想自己发布,但很高兴我把它添加到这里来完成
它是如何工作的?其思想是匹配正确的空格字符,并在其上拆分。关于这一点的基本原则将在这一问题中详细解释。首先,以与我的正则表达式类似的方式(但有更多的检查和递归),他定义了我们想要匹配的所有组,并匹配它们。然后,如果这些组匹配,他使用(*SKIP)(*F)
使正则表达式失败,然后引擎跳转到字符串中匹配的最后一个字符后面的位置。在交替的另一边,他匹配我们将拆分的空格字符,我们知道这些是右空格字符,因为它们没有与左边的表达式匹配。在此阶段,我们可以使用preg\u split
进一步的改进是使用我称之为HRRT
,它代表HamZa Regex重构技术。为了使正则表达式易于理解,他将其分解为更小的命名模式:singlequotes
,方括号
等等。这让他可以为所有这些组定义另一个名称:skippable
。定义之后,匹配开始。如果我们可以匹配可跳过的
模式,则正则表达式将以(*SKIP)(*F)
失败,引擎将跳到字符串中的下一个位置
这就是它的要点
给你
(?(定义)
(?P
<
(?:
[^]
|
(?&标志)
)*
>
)
(?P
\[
(?:
[^][]
|
(?&括号)
)*
\]
)
(?P
(?
(?
(?&单引号)|(?&双引号)
)
(?P
(?&括号)|(?&符号)|(?&引号)
)
)
(?&可跳过)(*跳过)(*失败)
|
[ ]+
更新:
这种模式也适用于我
(\[(?:[^\[\]]*?|(?R))*\])|()\G\s([^\[\]]+)
只需要学习如何使用regexp在这种情况下,没有更多的内容了。这里有一个链接指向我在这里读到的一些@eugenrick,preg\u split()
不知道引号中是否有东西。你可能真的需要一个解析器。我喜欢modular regex,'这是一个可以与preg\u split()一起使用的解决方案
。抱歉没有解释,太忙了:)@HamZa这是一个很好的解决方案。@Downvoter,想解释一下这个工作答案的Downvoter吗?@Locercus为什么preg_不拆分工作?
有时候拆分比较容易匹配,有时候匹配比较容易拆分。它们是看待同一事物的两种方式。想象一下这个序列:白,黑,白,黑。。。。你想要所有的白人。你可以选择黑色,也可以选择白色。我没有投反对票,但这家伙不需要一个解析器而不是正则表达式吗?@TobyAllen是的,我走得太快了,忘记了第一行以及所有关于使用正则表达式解析html的免责声明…
:)谢谢@Locercus如果您还有其他问题,请不要犹豫。:)谢谢你添加了一个新的<代码>[a sadasd][
是不平衡的,我是不是误解了什么?你是对的,更新了我的模式,递归出现了问题,现在可以工作了。顺便说一句,懒惰的?
在[^\[\]]*?
中似乎没有做任何事情,在我看来,你最好使用+
使其原子化。
(\[(?:[^[\]]++|(?1))*\])|<[^>]*>|'[^']*'|[!-~]+
$regex = "%(\[(?:[^[\]]++|(?1))*\])|<[^>]*>|'[^']*'|[!-~]+%";
$string = "<As's\\as'dsd> asqwedasd <sa sdasd> [a sadasd] [<asdsad> [as ddsd]] 'asdsad assd'";
$count = preg_match_all($regex,$string,$m);
print_r($m[0]);
(?(DEFINE)
(?P<signs>
<
(?:
[^<>]
|
(?&signs)
)*
>
)
(?P<brackets>
\[
(?:
[^][]
|
(?&brackets)
)*
\]
)
(?P<singlequotes>
(?<!\\)'(?:[^\\]|\\.)*?'
)
(?P<doublequotes>
(?<!\\)"(?:[^\\]|\\.)*?"
)
(?P<quotes>
(?&singlequotes)|(?&doublequotes)
)
(?P<skippable>
(?&brackets)|(?&signs)|(?"es)
)
)
(?&skippable)(*SKIP)(*FAIL)
|
[ ]+