【问题标题】:preg replace text outside of a tagspreg 替换标签外的文本
【发布时间】:2016-01-29 22:01:10
【问题描述】:

我对正则表达式一无所知。但我需要解决这个问题。 我想替换标签之外的所有文本。(如果有任何标签)

这是我的代码:

$entry = preg_replace("'\(find: (.*)\)'Ui","(find: <a href=\"/search/\\1/\"><b>\\1</b></a>)",$entry);

它应该在 html 标记之外替换 (find: foo)。

我试过这个,但没有用。因为我不懂正则表达式:(

preg_replace("'([^<]+?>)\(find: (.*)\)([^<]+?>)'Ui","(find: <a href=\"/find/\\1/\"><b>\\1</b></a>)",$entry);

提前谢谢你。 :)

编辑:这是我的例子:

// some users do this. and it brokes the text.

$entry = "blablabla (find: (user: bora)) blablabla ";

function entry($entry) {
    $entry = preg_replace("'\(find: (.*)\)'Ui","<a href=\"/find/\\1/\"><b>\\1</b></a>",$entry);
    $entry = preg_replace("'\(user: (.*)\)'Ui","(user: <a href=\"/user/\\1/\"><b>\\1</b></a>)",$entry);
    $entry = stripslashes($entry);
    return $entry;
}

【问题讨论】:

  • 使用 DOMXPath 提取包含您要查找的内容的文本节点。
  • 你应该永远用正则表达式解析 HTML。请改用a PHP DOM parser
  • 如果这是 HTML,则所有文本都包含在标签中,最终由 bodyhtml 标签包装。那你什么意思?
  • 感谢您的快速回复。但我一个都不知道。我只是个业余爱好者。我买了脚本,发现了这个问题。你能帮我做正则表达式吗?
  • @trincot $entry 只是文本。但是有多个 preg_replace。

标签: php html regex preg-replace


【解决方案1】:

以下是防止您描述的问题的方法:

function linkit($match) {
    $item = urlencode($match[1]); // "user" or "find", made safe for URL
    $href = urlencode($match[2]); // part after ":", made safe for URL
    $content = htmlentities($match[2]); // part after ":" made safe for HTML
    return "<a href='/$item/$href/'><b>$content</b></a>";
}

function entry($entry) {
    // Use one replace operation for both "find" or "user":
    // For each match the function linkit is called. 
    // These 3 characters may not occur before closing parentheses:
    //    ( < >
    $entry = preg_replace_callback("'\((find|user): ([^(<>]*?)\)'ui", 
                                   'linkit', $entry);
    return $entry;
}

$entry = "blablabla (find: (user: bora)) blablabla ";
echo entry($entry);

输出:

blablabla (find: <a href='/user/bora/'><b>bora</b></a>) blablabla 

如您所见,"(find: ...)" 没有被替换,因为在第一个右括号之前还有另一个左括号。即使您对该结果再次调用 entry(),它也不会改变,因为在 "(find :... 。”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-05
    • 1970-01-01
    • 2014-03-14
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 2020-05-22
    相关资源
    最近更新 更多