Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.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
使用python从字符串中删除php标记_Php_Python - Fatal编程技术网

使用python从字符串中删除php标记

使用python从字符串中删除php标记,php,python,Php,Python,我想从字符串中删除php标记 content = re.sub('<\?php(.*)\?>', '', content) content=re.sub('',content) 在单行php标记上似乎可以正常工作,但当php标记在某些行之后关闭时,它无法捕获它。 有人能帮忙吗?您可以通过以下方式完成: content = re.sub('\n','', content) content = re.sub('<\?php(.*)\?>', '', content) 使

我想从字符串中删除php标记

content = re.sub('<\?php(.*)\?>', '', content)
content=re.sub('',content)
在单行php标记上似乎可以正常工作,但当php标记在某些行之后关闭时,它无法捕获它。
有人能帮忙吗?

您可以通过以下方式完成:

content = re.sub('\n','', content)
content = re.sub('<\?php(.*)\?>', '', content)

使用正则表达式无法解决此问题。从字符串中解析PHP需要一个真正的解析器,该解析器至少理解一点PHP

但是,如果有可用的PHP,您可以非常轻松地解决此问题。最后是PHP解决方案

下面演示了正则表达式方法可能出现的错误:

重新导入
测试用例={
“简单”:(“显示此”,“显示此”),
“多个标记”:(“显示此项,即使它是有条件的”),“显示此项,即使它是有条件的”),
‘省略?>’:(‘显示此显示此’,‘显示此显示此’),
“shorttags”:(“show this show this”、“show this show this”),
“echotags”:(“显示此”“显示此”“显示此”),
}
testfailstr=“”
失败:%s
在%s中
预期:%s
获取:%s
"""
removephp=re.compile(r'(?s'))
对于testcases.items()中的testname,(in,expect):
got=removephp.sub(“”,在
如果你期待的话=得到了:
打印testfailstr%元组(映射(repr,(testname,in_u2;,expect,got)))
请注意,要使正则表达式通过所有测试用例,即使不是不可能,也是极其困难的

如果您有可用的PHP,您可以使用PHP的标记器去除PHP。下面的代码应该毫无疑问地将所有PHP代码从字符串中去除,并且应该涵盖所有奇怪的情况

//一个字符标记,始终为代码
定义('T_ONECHAR_TOKEN','T_ONECHAR_TOKEN');
函数条_php($input){
$tokens=token\u get\u all($input);
$output='';
$inphp=False;
foreach($tokens作为$token){
如果(是字符串($token)){
$token=数组(T_ONECHAR_token,$token);
}
列表($id,$str)=$token;
如果(!$INPPP){
如果($id==T\u OPEN\u TAG或$id==T\u OPEN\u TAG\u WITH\u ECHO){
$inphp=True;
}否则{
$output.=$str;
}
}否则{
如果($id==T\u关闭\u标记){
$inphp=False;
}
}
}
返回$output;
}

$test='a show this如果您只想处理简单的情况,一个简单的正则表达式就可以了。Python正则表达式中的
*?
运算符提供了最小匹配

重新导入
_PHP_TAG=re.compile(r'',re.DOTALL)
def strip_php(内容):
返回_PHP_TAG.sub('',内容)
输入=”“
简单:。
一行两个:。
多行:。
"""
打印条_php(输入)
输出:

Simple: . Two on one line: (keep this) . Multiline: . 简单:。 一条线上有两个人:(留着这个)。 多行:。 我希望您不要用它来清理输入,因为这还不够好。(这是黑名单,不是白名单,黑名单永远不够。)

如果您想处理复杂的案件,例如:


您仍然可以使用正则表达式,但是您可能希望重新考虑您正在使用的工具,因为正则表达式可能变得太复杂而无法阅读。以下正则表达式将处理Francis Avila的所有测试用例:

dstr=r'([^“\\]\\\)*“'
sstr=r“'(?:[^'\\]\\\)*”
_PHP_TAG=re.compile(

r'''以及如何撤销对\n的不必要更改??你说得对!你可以使用一种解决方案,将新行替换为文件中不太可能包含的
something
。然后运行正则表达式以过滤掉php标记。最后,将
something
替换为新行。很抱歉,它会删除所有字符串。这是错误的打开一个只包含一个\n而没有其他内容的字符串,可能是第二行捕获的整个字符串。谢谢,我的实际测试比您的测试更复杂,结果是空白字符串为什么我得到-1?我提出了一个简单的解决方案,适用于不太复杂的输入。我认为这超出了正则表达式的能力,您需要n实际的解析器。例如:
PHP
,等等。@FrancisAvila只需删除即可完成我的工作!不,不会。你认为会,但不会。针对这些测试用例尝试正则表达式。还请记住,你可以在PHP中省略最后的
。我可以检查一下。但你能解决我的第一个问题吗??你不能用正则表达式解决这个问题。我添加了一个答案来说明这一点。我很欣赏这个实用的答案,并解释了为什么正则表达式不够用。很好。我已经发布了一个正则表达式来处理你的所有测试用例。我想和大多数标记器一样,PHP标记器是基于f中的正则表达式构建的首先,通过使用PHP标记器,您可以省去编写正则表达式的工作,但实际上您仍然在使用正则表达式。如果您感到好奇,您可以阅读PHP源代码文件
Zend/Zend\u language\u scanner.l
中PHP使用的正则表达式。在我的情况下,它可以工作,但没有
re.DOTALL|re.MULTILINE
你说得对,两者都不是必需的。我在玩正则表达式时忘了取出它们。
In [81]: content
Out[81]: ' 11111  <?php 222\n\n?> \n22222\nasd  <?php asd\nasdasd\n?>\n3333\n'

In [82]: content = re.sub('\n',' {NEWLINE} ', content)
In [83]: content
Out[83]: ' 11111  <?php 222 {NEWLINE}  {NEWLINE} ?>  {NEWLINE} 22222 {NEWLINE} asd  <?php asd {NEWLINE} asdasd {NEWLINE} ?> {NEWLINE} 3333 {NEWLINE} '

In [84]: content = re.sub('<\?php(.*)\?>', '', content)
In [85]: content
Out[85]: ' 11111   {NEWLINE} 3333 {NEWLINE} '

In [88]: content = re.sub(' {NEWLINE} ','\n', content)
In [89]: content
Out[89]: ' 11111  \n3333\n'
Simple: . Two on one line: (keep this) . Multiline: .