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

PHP正则表达式模式未标识标记的结束括号

PHP正则表达式模式未标识标记的结束括号,php,html,regex,Php,Html,Regex,我有一个文本区域,其中可能包含标签。我需要在src属性(“/storyimages/”)中用一个特定的文本字符串标识这些标记并删除它们。例如,如果我有文本 <br><img src="/storyimages/myimage.jpg" align="right" WIDTH="105" HEIGHT="131"><b>(CNS) </b>Lorem ipsum dolor... (CNS)Lorem ipsum dolor。。。 我只想去掉整个

我有一个文本区域,其中可能包含标签。我需要在src属性(“/storyimages/”)中用一个特定的文本字符串标识这些标记并删除它们。例如,如果我有文本

<br><img src="/storyimages/myimage.jpg" align="right" WIDTH="105" HEIGHT="131"><b>(CNS) </b>Lorem ipsum dolor...

(CNS)Lorem ipsum dolor。。。
我只想去掉整个标记并用“”替换它。我尝试使用的正则表达式模式是

/<img src=.*\/storyimages\/.*>/
//
但它不起作用。发生的情况是,它标识字符串ok的开头,但不标识closing>字符,因此如果使用preg_match(),匹配将以开始

我知道你不应该在HTML上使用正则表达式,但这不是嵌入的标记;这只是一堆文本中的一个标签,所以我应该没问题。从我看来,>并不是一个特殊的角色,但即使我逃避了它,我仍然会得到同样的结果

我有没有遗漏一些简单的东西可以让这一切顺利进行?或者我是否需要编写某种函数,逐字符循环字符串以查找开括号和闭括号的位置,然后替换它们

有趣的是,当我尝试使用时,效果很好,但是当我实际运行代码时,我遇到了上面描述的问题


谢谢。

使用
正则表达式

主要的一点是使用
*?
quanitifier使匹配非贪婪(即尽可能匹配最少的匹配字符)

下面是一个PHP代码示例:

$re = "/<img src=.*?\\/storyimages\\/.*?>/"; 
$str = "<br><img src=\"/storyimages/myimage.jpg\" align=\"right\" WIDTH=\"105\" HEIGHT=\"131\"><b>(CNS) </b>Lorem ipsum dolor..."; 
preg_match($re, $str, $matches);
$re=“/”;
$str=“
(CNS)Lorem ipsum dolor…”; 预匹配($re,$str,$matches);

匹配看起来像

这里有一种不使用regex的方法:如果你的问题是你没有匹配img之后的第一个
,你需要使用
使它变懒,regex将是
,测试后续问题:如上所述,这完美地隔离了标记。但是,我无法在文本中替换字符串,或者使用preg_replace()替换模式,或者使用str_replace()替换匹配数组中的返回值。如果在str_replace()中使用count选项,它将返回1,但不会替换任何内容。此外,您的代码示例在/storyimages/的两侧都有两个反斜杠。这只是一个输入错误吗?请检查此示例程序:。它显示我可以使用
preg\u replace
。我不知道你是什么意思,我只是用
/storyimages/
将正则表达式指向任何具有此字符串的标记。我(错误地)指的是在代码示例中转义反斜杠(它们在你回答的第一个代码示例中不存在)。我遇到的问题是,我的模式在preg_match_all()查找标记并将它们放入匹配数组时非常有效,但当我实际替换它们时,相同的模式不起作用。我怀疑这与需要转义字符串中的双引号有关。我已经尝试在我的文本字符串上使用addslashes()(它比我的示例中长得多),但它仍然没有被替换。仍在处理中…检查替换字符串中的特定字符。如果有
$
,则应加倍。叹气。我发现了问题所在,这与正则表达式本身无关。非常感谢您的帮助和快速回复。