PHP替换,但替代替换字符串

时间:2009-07-02 04:23:59

标签: php markdown replace

好的,这就是我要做的事情:我正在尝试使用PHP开发一个基本上是降价实现的 tiny 子集,不值得使用完整的降价类。

我基本上需要做一个str_replace,但是每次出现针时都会替换替换字符串,以便处理打开和关闭HTML标记。

例如,斜体是一对像* this *这样的星号,代码块被像“this”这样的反引号所包围。

我需要用对应的开头HTML标签替换第一次出现的一对字符,第二次用结束标记替换。

关于如何做到这一点的任何想法?我认为会涉及某种正则表达式......

3 个答案:

答案 0 :(得分:4)

就个人而言,我会使用计数器遍历*\的每次出现,并根据计数将该字符替换为相应的HTML标记(例如,如果计数是均匀的你点了一个星号,用<em>替换它,如果它是奇数然后用</em>替换它,等等。)

但如果您确定只需要支持几种简单的标记,那么每种标记的正则表达式可能是最简单的解决方案。像星号这样的东西,例如(未经测试):

preg_replace('/\*([^*]+)\*/', '<em>\\1</em>', $text);

类似的反斜杠。

答案 1 :(得分:3)

您正在寻找的内容通常由状态机或词法分析器/解析器处理。

这很难看,但确实有效。捕获:一次只能用于一种模式类型。

$input = "Here's some \\italic\\ text and even \\some more\\ wheee";

$output = preg_replace_callback( "/\\\/", 'replacer', $input );

echo $output;

function replacer( $matches )
{
    static $toggle = 0;
    if ( $toggle )
    {
        $toggle = 0;
        return "</em>";
    }
    $toggle = 1;
    return "<em>";
}

答案 2 :(得分:1)

我创建了str_replace的替代方法,因为str_replace的PHP手册指出:

如果搜索和替换是数组,则str_replace()取一个值 从每个数组中搜索并替换它们。

如果replace的值少于搜索的值,则使用空字符串 其余的替换值。

如果搜索是一个数组,而替换是一个字符串,则此替换 字符串用于每个搜索值。 相反,这没道理。

但是,如果同一根针在干草堆中出现多次,例如“?”,那么反过来确实有意义。在准备好的语句(例如PHP的MySQLi扩展名)中,您需要编写日志或诊断报告,以了解通过参数运行时发生的情况,将参数替换为查询字符串中的内容以进行“剪切并粘贴”版本查询其他地方的测试。

针的出现从左到右替换为replace数组中的值。如果出现更多的更换针,它将重置替换数组指针。这意味着对于OP的使用,针将为“ *”,而替换将为具有两个值“ <I>”和“ </I>”的数组。

function str_replace_seriatim(string $needle, array $replace, string $haystack) {
    $occurrences = substr_count($haystack, $needle);
    for ($i = 0; $i <= $occurrences; $i++) {
        $substitute = current($replace);
        $pos = strpos($haystack, $needle);
        if ($pos !== FALSE) $haystack = substr_replace($haystack, $substitute, $pos, strlen($needle));
        if ((next($replace) === FALSE)) reset($replace);
    }
return $haystack;
}

要在一个函数调用中完成全部任务,我想可以将其扩展一点,以一个针($ pincushion)阵列和一个多维阵列作为替换,但是我不确定这是否可以除了多个函数调用外,还没有更多的工作。