3

好的,这就是我正在尝试做的事情:我正在尝试使用 PHP 来开发本质上是降价实现的一部分,不值得使用完整的降价类。

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

例如,斜体是一对星号,如 *this*,代码块被反引号包围,如 `this`。

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

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

4

3 回答 3

5

就个人而言,我会循环遍历每个出现的*\使用计数器,并根据计数用适当的 HTML 标记替换字符(例如,如果计数是偶数并且您点击了星号,则将其替换为<em>,如果它是奇数然后将其替换为</em>等)。

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

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

反斜杠也有类似的东西。

于 2009-07-02T04:37:47.860 回答
4

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

这很丑陋,但它有效。Catch:一次只针对一种模式类型。

$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>";
}
于 2009-07-02T05:43:47.277 回答
1

我创建了 str_replace 的替代方案,因为 str_replace 的 PHP 手册说:

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

如果 replace 的值比 search 少,则将空字符串用于其余的替换值。

如果 search 是一个数组并且 replace 是一个字符串,那么这个替换字符串将用于 search 的每个值。 但是,反过来就没有意义了。

但是,如果同一根针在您的大海捞针中多次出现,例如“?”,则相反是有意义的。在一个准备好的语句(例如 PHP 的 MySQLi 扩展)中,您需要编写一个日志或诊断报告,说明它通过参数运行时发生的情况,替换查询字符串中的参数以制作一个“剪切和粘贴”版本的查询其他地方的测试。

针的出现从左到右替换为替换数组中的值。如果有更多的 needle 出现有替换,它会重置替换数组指针。这意味着对于 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)和多维数组作为替代,但我不确定这是否不是更多工作不仅仅是多个函数调用。

于 2020-08-07T12:29:33.900 回答