查找和替换URL的快捷代码

时间:2013-09-11 作者:Tim McClure

我正在尝试创建一个快捷码,它将在指定的文本中搜索链接,并将其替换为我指定的链接。例如:

[scode]Click on <a href="www.X.com">this link</a>[scode]
[scode]Click on <a href="www.Y.com">this link</a>[scode]
。。。两者都将更改为:

[scode]Click on <a href="www.Z.com">this link</a>[scode]
我正在尝试组合一个函数,该函数将搜索链接并用我指定的链接替换它们。以下是我现在拥有的:

// Adds [hide] shortcode for hiding content from non-registered users.

function hide_text( $atts,$content) {
    if ( is_user_logged_in () ) {
        return $content;
    }
    else {
        $pattern = \'(?<=href=("|\\\'))[^"\\\']+(?=("|\\\'))\';
        $newurl = "http://replacementurl.com";
        $content = preg_replace($pattern,$newurl,$content);
        echo $content;
          }
    }
add_shortcode( \'hide\', \'hide_text\' );
不过,这只会使网站崩溃。我不是PHP专家(更不用说regex专家),但我的代码中是否存在任何明显的违规行为?

或者也许有更好的方法来解决这个问题,我把它变得比需要的更复杂?

UPDATE:

按照建议,我打开了调试日志,这表明我有一个额外的} 在代码中。更新的代码如上所示。现在网站没有崩溃,但短代码中的链接和文本被完全删除,只是空白。

2 个回复
SO网友:gmazzap

您的快捷码函数应如下所示:

function replace_url_for_nonlogged( $atts, $content = "") {
  if ( is_user_logged_in () ) return $content;
  extract( shortcode_atts( array(
    \'replace\' => \'http://www.default_replace_url.com\',
  ), $atts ) );
  $pattern = \'/href=("|\\\')((([A-Za-z]{3,9}:(?:\\/\\/)?)(?:[-;:&=\\+\\$,\\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\\+\\$,\\w]+@)[A-Za-z0-9.-]+)((?:\\/[\\+~%\\/.\\w-_]*)?\\??(?:[-\\+=&;%@.\\w_]*)#?(?:[\\w]*))?)("|\\\')/\';
  return preg_replace($pattern, "href=\\"$replace\\"", $content);
}
add_shortcode( \'scode\', \'replace_url_for_nonlogged\' );
然后,您可以使用如下短代码:

[scode]Lorem <a href="http://reservedurl.com">ipsum</a> dolor <a href=\'http://resersinglequoted.com\'>simet</a>.[/scode]
结果是:

Lorem <a href="http://www.default_replace_url.com">ipsum</a> dolor <a href="http://www.default_replace_url.com">simet</a>.
替换的url在replace_url_for_nonlogged 作用

如果需要,可以通过快捷码att传递替换url,例如。

[scode replace="http://www.google.com"]Lorem <a href="http://reservedurl.com">ipsum</a> dolor <a href=\'http://resersinglequoted.com\'>simet</a>.[/scode]
这一次的输出是:

Lorem <a href="http://www.google.com">ipsum</a> dolor <a href="http://www.google.com">simet</a>.
<小时>enter image description here

SO网友:pixeline

尝试以下操作:

function timMcLure_hide_text( $atts,$content="") {
    if (!is_user_logged_in () ) {
      $pattern = "<a\\s[^>]*href=(\\"??)([^\\" >]*?)\\\\1[^>]*>(.*)<\\/a>";
      $newurl = "http://replacementurl.com";
      $content = preg_replace($pattern, $newurl, $content);
    }
    return $content;
}
add_shortcode( \'urlhide\', \'timMcLure_hide_text\' );
然后使用[urlhide]作为短代码。

请尝试并报告,因为我无法轻松测试这一点。

结束

相关推荐

Admin-ajax.php不再加载

我正在研究wordpress 3.6。一切都很好,但在启动网站之前,管理员更改了域名。所有内容都保留在同一台服务器中。我们不需要移动任何文件,所有文件和文件夹都保持在以前的相对位置。为了处理域名的变化,我用Search & Replace DB 据我所知,脚本和所有内容在前端都运行良好。然而,后端存在一些问题。最令人讨厌的是管理ajax。php不再加载,阻止我们添加/删除/编辑图像和所有其他需要此脚本的任务。这是FIREBUG在编辑帖子并单击“添加媒体”时给我的信息:GET http://word