我正在尝试用''
替换以下字符串的每个匹配项,但保留大括号和文本。 span元素周围还有文本,并且有多个标签,其中tag_item变化且标签标题不同。
示例字符串:
Text text text text
<span contenteditable="false" data-tag="{{tag_item}}">Tag Title</span>
Text text text text
<span contenteditable="false" data-tag="{{tag_item2}}">Tag Title2</span>
Text text text text
我希望它成为:
Text text text text
{{tag_item}}
Text text text text
{{tag_item2}}
Text text text text
这是我到目前为止所做的,而且它无法正常工作:
$message = preg_replace('/" contenteditable="false">(.*)<\/span>/i', '', $message);
$message = str_replace('<span data-tag="', '', $message);
提前致谢。
答案 0 :(得分:3)
你可以这样做:
$m = preg_replace ('/<span contenteditable="false" data-tag=\"/i','',$message);
$answer = preg_replace ('/\">.*?<\/span>/i', '' ,$m);
答案 1 :(得分:0)
这是你要找的吗?
$ message = preg_replace('/。 data-tag =“(。)”。* /','$ 1',$ message);
答案 2 :(得分:0)
好吧,然后在一个正则表达式中执行:
= preg_replace("#
<(\w+) [^>]* (\{\{\w+\}\}) [^>]*>
(.*?)
</\1>
#smix", "$2 $3", $src)
这只是查找您的{{tag}}以及其他所有内容$2
和尖括号之间的文字$3
。
答案 3 :(得分:0)
不要使用Regex解析HTML,请使用DOM。
$html = <<<'HTML'
Text text text text
<span contenteditable="false" data-tag="{{tag_item}}">Tag Title</span>
Text text text text
<span contenteditable="false" data-tag="{{tag_item2}}">Tag Title2</span>
Text text text text
HTML;
$dom = new DOMDocument();
$dom->loadHtml($html);
$xpath = new DOMXpath($dom);
$expression = '//text()[not(parent::*[@data-tag])]|//*[@data-tag]/@data-tag';
foreach ($xpath->evaluate($expression) as $node) {
switch ($node->nodeType) {
case XML_TEXT_NODE :
echo $node->nodeValue;
break;
case XML_ATTRIBUTE_NODE :
echo $node->value;
break;
}
}
如果父级不是具有data-tag属性和所有数据标记属性的元素,则Xpath表达式匹配所有文本节点。
匹配DOM中任何位置的所有文本节点:
//text()
将其限制为父级没有“data-tag”属性的节点
[not(parent::*[@data-tag])]
或者
|
选择所有数据标记属性
@data-tag
答案 4 :(得分:0)
如果我理解你的问题,也许这可能是你的解决方案
$message = preg_replace('/<\w+\s+contenteditable="false"\s+data-tag="({{.*}})">.*<\/\w+>/imsU', '$1', $message);
选项“U”用于Ungreedy并尝试找到最短的出现而不是所有可数元素的最长出现(我的意思是后跟“?”,“+”或“*”的元素。)
您可以在此页面上拥有更多选项: http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php