【问题标题】:php search function using wildcards使用通配符的php搜索功能
【发布时间】:2010-08-30 19:12:30
【问题描述】:

这个问题与Php search string (with wildcards) 几乎相同,但会有所不同。我很难理解提出的解决方案,以便从中做出自己的想法。也许你们可以帮忙?

我有一个起始字符串和一个结束字符串,用于将感兴趣的字符串夹在中间。

这是我目前正在使用的函数:

function get_string_between($string, $start, $end)
{
     $string = " ".$string;
     $ini = strpos($string,$start);
     if ($ini == 0) return "";
     $ini += strlen($start);   
     $len = strpos($string,$end,$ini) - $ini;
     return substr($string,$ini,$len);
}

有时我的开头字符串需要在其中包含通配符以说明模板的动态部分

例如,我需要它作为我的开始代码变量:

$begin_code = "id='%wildcard%' class='sailors_assistant_%wildcard%'>";

并编辑我上面的原始函数以检测 %wildcard%(s) 并在使用他们的三明治 search-n-grabs 时考虑它们。

有什么建议吗?

【问题讨论】:

    标签: php regex


    【解决方案1】:

    最简单的方法是使用正则表达式:

    function get_string_between($string, $start, $end) {
        $start = str_replace("%wildcard%", ".*?", preg_quote($start, "/");
        $end = str_replace("%wildcard%", ".*?", preg_quote($end, "/");
        $regex = "/$start(.*?)$end/";
        if (preg_match($regex, $string, $matches))
            return $matches[1];
        else
            return false;
    }
    

    【讨论】:

    • 感谢您的大力帮助。我会运行一段时间,然后回来报告它的效果。
    • 您好---我一直在运行和使用该功能,但遇到了问题。问题是,当在有不止一次 $end 出现的大面积文本上运行此正则表达式 /$start(.*)$end/ 时,它将使用最后一次出现而不是在 $start 之后找到的最近一次出现。有没有办法解决这个问题?
    • @atwell,我已编辑答案以解决该问题。您必须使量词不贪婪。
    • 太棒了!最终的正则表达式是 $regex = "/$start(.*?)$end/si";,修改的 s 对于我正在做的工作类型是必要的,但我对推理有点模糊。 i 修饰符用于不区分大小写,这并不是必需的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多