好的,这就是我正在尝试做的事情:我正在尝试使用 PHP 来开发本质上是降价实现的一小部分,不值得使用完整的降价类。
我基本上需要做一个 str_replace,但每次出现针时交替替换字符串,以便处理打开和关闭 HTML 标记。
例如,斜体是一对星号,如 *this*,代码块被反引号包围,如 `this`。
我需要将第一次出现的一对字符替换为对应的开始 HTML 标记,第二次替换为结束标记。
关于如何做到这一点的任何想法?我认为会涉及某种正则表达式...
就个人而言,我会循环遍历每个出现的*
或\
使用计数器,并根据计数用适当的 HTML 标记替换字符(例如,如果计数是偶数并且您点击了星号,则将其替换为<em>
,如果它是奇数然后将其替换为</em>
等)。
但是,如果您确定只需要支持几种简单的标记,那么每个标记的正则表达式可能是最简单的解决方案。像这样的星号,例如(未经测试):
preg_replace('/\*([^*]+)\*/', '<em>\\1</em>', $text);
反斜杠也有类似的东西。
您要查找的内容通常由状态机或词法分析器/解析器处理。
这很丑陋,但它有效。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>";
}
我创建了 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)和多维数组作为替代,但我不确定这是否不是更多工作不仅仅是多个函数调用。