Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.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_String_Explode - Fatal编程技术网

在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的所有免责声明。。。只有当你准备好了一些递归美的时候, 匹配您想要的内容与分割您不想要的内容 在本例中,如果要使用正则表达式来获取数组,那么匹配所需内容将

在PHP中,如何使用以下语法拆分一行:

<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)|(?&quotes)
   )
)

(?&skippable)(*SKIP)(*FAIL)
|
[ ]+