【问题标题】:Removing characters from a variable created using preg_replace从使用 preg_replace 创建的变量中删除字符
【发布时间】:2014-06-18 13:28:51
【问题描述】:

所以我试图在我从 preg_replace 函数获得的 URL 末尾删除几个字符。但是,它似乎不起作用。我不熟悉在 preg_replace 中使用这些变量(这只是我发现“大部分”有效的东西)。

这是我的尝试:

function addlink_replace($string) {
    $pattern = '/<ul(.*?)class="slides"(.*?)<img(.*?)src="(.*?)"(.*?)>(.*?)<\/ul>/is';
    $URL = substr($4, 0, -8);;

    $replacement = '<ul$1class="slides"$2<a rel=\'shadowbox\' href="'.$URL.'"><img$3src="$4"$5></a>$6</ul>';
    return preg_replace($pattern, $replacement, $string);
}
add_filter('the_content', 'addlink_replace', 9999);

基本上我需要删除 .jpg 文件名的最后一位,这样我就可以显示 LARGE 图像而不是它生成的 THUMBNAIL,但“$4”似乎不想被操纵。

【问题讨论】:

  • 你能只对需要替换的部分进行字符串替换吗?
  • Ibu - 这就是我试图用 $URL 变量和 substr 做的事情。我试图在字符串中获取我的网址“$4”,删除最后 8 个字符,然后在我的替换中使用新变量 $URL。但是我不确定从正则表达式创建的变量可以更改吗?我以前没有尝试过操纵它们。如果我这样做 $URL = 'test';然后“测试”出现在我的代码中。但是尝试使用 $4 我收到一条错误消息,提示 UNEXPECTED '4'
  • 如果您为我们提供示例数据会有所帮助。
  • 请发布源示例和所需输出,以便我们为您提供进一步帮助。

标签: php regex wordpress html-parsing preg-replace


【解决方案1】:

此答案基于您希望通过other question 的 HTML 结构在此问题中完成的任务。除了第一组 &lt;li&gt;&lt;img&gt; 标记和 you've indicated 您需要匹配 &lt;ul&gt; 中的所有 &lt;li&gt;&lt;img&gt; 标记之外,您的问题中发布的正则表达式不会匹配任何内容所以我写了一个更大的函数来做到这一点。

它会将&lt;li&gt; 内的所有&lt;img&gt; 标签包装在&lt;ul&gt; 中,slides 的类带有&lt;a&gt;,源是图像的URL,并删除了-110x110 字符串, 同时在&lt;img&gt; 标签中保留缩略图源。

function addlink_replace($string) {
    $new_ul_block = '';
    $ul_pattern = '/<ul(.*?)class="slides"(.*?)>(.*?)<\/ul>/is';
    $img_pattern = '/<li(.*?)>(.*?)<img(.*?)src="(.*?)"(.*?)>(.*?)<\/li>/is';

    preg_match($ul_pattern, $string, $ul_matches);

    if (!empty($ul_matches[3]))
    {
        preg_match_all($img_pattern, $ul_matches[3], $img_matches);

        if (!empty($img_matches[0]))
        {
            $new_ul_block .= "<ul{$ul_matches[1]}class=\"slides\"{$ul_matches[2]}>";

            foreach ($img_matches[0] as $id => $img)
            {
                $new_img = str_replace('-110x110', '', $img_matches[4][$id]);
                $new_ul_block .= "<li{$img_matches[1][$id]}>{$img_matches[2][$id]}<a href=\"{$new_img}\">";
                $new_ul_block .= "<img{$img_matches[3][$id]}src=\"{$img_matches[4][$id]}\"{$img_matches[5][$id]}></a>{$img_matches[6][$id]}</li>";
            }

            $new_ul_block .= "</ul>";
        }
    }

    if (!empty($new_ul_block))
    {
        $replace_pattern = '/<ul.*?class="slides".*?>.*?<\/ul>/is';
        return preg_replace($replace_pattern, $new_ul_block, $string);
    }
    else
    {
        return $string;
    }
}

&lt;a&gt;href 属性从图像所具有的更改是专门在线完成的

$new_img = str_replace('-110x110', '', $img_matches[2][$id]);

如果你想修改它。如果您需要从 URL 中删除除 -110x110 以外的任何内容,您可能需要将其从 str_replace 更改为 preg_replace,或者如果您想从 URL 末尾删除特定数量的字符,您可以使用substr:

$new_img = substr($img_matches[2][$id], 0, -12);

其中-12 是您要从字符串末尾删除的字符数(它是负数,因为它从末尾开始)。

我已经发布了这个函数的工作示例here

您可能需要考虑修改生成此代码块的源代码,而不是使用此正则表达式,因为如果 HTML 结构发生变化,此正则表达式将来可能难以维护。

【讨论】:

  • -110x110 不应更改,因为所有缩略图的大小都相同,但我可能会删除最后 8 个字符,以防客户决定更改缩略图大小。我也很想修改原始代码,但由于它是一个 wordpress 插件,我倾向于尝试修改函数中的内容,这样我就不会遇到更新问题。我以前对正则表达式的东西没有太多经验。非常感谢您的所有帮助 wanasten,您是真正的救星!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多