Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.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 用于过滤、解析和替换特定字符串的Reg Ex?(菲律宾)_Php_Regex - Fatal编程技术网

Php 用于过滤、解析和替换特定字符串的Reg Ex?(菲律宾)

Php 用于过滤、解析和替换特定字符串的Reg Ex?(菲律宾),php,regex,Php,Regex,在为客户机开发私有CMS时,我有一个想法,即实现一个php底层、但服务器端和灵活的“语言” 我很难找到reqular表达式查找(filter…)下面的字符串([…]是代码,在过滤掉之后将对其进行解析),我想用换行符过滤掉该字符串 我整晚都在寻找解决方案,但没有找到解决方案。首先:听上面的建议 根据我目前对您问题的理解,您希望获得之间的逐字记录内容-无例外,无注释处理 如果是,请尝试此RegExp '/<\(((?:.|\s)*?)\)>/' '/' 你可以这样用 preg_m

在为客户机开发私有CMS时,我有一个想法,即实现一个php底层、但服务器端和灵活的“语言”

我很难找到reqular表达式查找(filter…)下面的字符串([…]是代码,在过滤掉之后将对其进行解析),我想用换行符过滤掉该字符串


我整晚都在寻找解决方案,但没有找到解决方案。

首先:听上面的建议

根据我目前对您问题的理解,您希望获得
之间的逐字记录内容-无例外,无注释处理

如果是,请尝试此RegExp

'/<\(((?:.|\s)*?)\)>/'
'/'
你可以这样用

preg_match_all('/<\(((?:.|\s)*?)\)>/', $yourstring, $matches)
preg_match_all('/',$yourstring,$matches)
它不需要区分大小写,并且进行惰性匹配(因此可以将其应用于具有多个匹配实例的字符串)



RegExp的解释:从
开始(当然括号转义),中间是捕获组。在其核心,我们要么使用常规字符
要么使用空白
\s
(这解决了您的问题,因为换行符也是空白)。我们不希望捕获每一个字符,因此内部组是非捕获的-只有空格或字符:
(?:.|\s)
。此操作重复任意次数(包括零次),但仅在第一次匹配完成之前执行:
*?
用于惰性0-n。仅此而已,希望能有所帮助。

如果您无法编写自己的正则表达式,您确定应该编写自己的语言吗?如果您想让它们不仅仅是简单的字符串占位符,正则表达式也无法解析这些语言?也许你应该在你的CMS中使用其他人的模板系统。Markdown,Smarty,什么的。几十年来,人们一直在编写模板语言,你不必重新发明轮子。这并不是说我不能编写正则表达式。这就像我无法解析具有该格式的字符串和php-format中的换行符一样。那么-您想获取逐字内容,以及介于“”之间的所有内容吗?没有关于注释或转义的特殊规则?一点也没有。在这里写这篇文章可能是我的错误。很抱歉给您带来不便:(-1,请考虑:
,您的建议与字符串中第一个

匹配,然后消耗所有内容,直到到达字符串末尾,然后返回到最后一个

(因此,如果文件中的

,您就有麻烦了)。您应该在第一句话之后停止键入。:)它不打算解析整个文件、注释或任何通用的内容-使用两个
对我来说意味着在应用此RegExp之前,内容已被切碎。否则,如果存在多个
,则将不确定将采用哪种内容。在我回答的第二段,我谈到了这一点。为了构造一个安全、可重复的RegExp,应该有更多关于格式的信息。我同意:在能够给出正确的答案之前,应该有更多关于格式的信息(因此,在我看来,你也应该等待一个答案)。现在,它仍然应该得到-1 IMO。也许最好不要认为代码依赖于
。查看这篇文章的编辑。@foo:That
(?:.|\s)*?
总有一天会给你带来大麻烦;查看此答案了解原因:匹配任何内容(包括换行符)的正确方法是在单行中使用点a.k.a.点匹配所有模式。这通常是通过在正则表达式的末尾添加
s
修饰符来完成的。顺便说一下,正则表达式中的
m
修饰符没有任何作用。
preg_match_all('/<\(((?:.|\s)*?)\)>/', $yourstring, $matches)