PHP preg_replace所有内容,但括号中的文本

时间:2013-11-22 03:52:09

标签: php html regex preg-replace

我正在尝试用''替换以下字符串的每个匹配项,但保留大括号和文本。 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);

提前致谢。

5 个答案:

答案 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