如何用PHP中的其他文本替换段落中的某些文本

时间:2013-12-24 19:48:58

标签: php

<?php

$string="Hello how are ##you ? I want ##join you.";

echo $string;

// now I want replace all ##.... words with <a>##.....</a>
// example Hello how are <a>##you</a> ? I want <a>##join</a>you.

?>

现在我要用##替换所有## ....单词..... 例子你好##你好吗?我想##加入你。

1 个答案:

答案 0 :(得分:2)

我会让别人去寻找正则表达式解决方案。我会提出一些希望更具可读性的东西。

以下代码使用我的Parser class from Paladio(它在CC-BY 3.0下),它适用于UTF-8。只需下载raw version of the library,它就没有依赖关系了。

cde在评论中解释:

<?php
    $string = "Hello how are ##you ? I want ##join you.";

    // now I want replace all ##.... words with <a>##.....</a>

    //Create a parser object for the string
    $parser = new Parser($string);

    //Create a variable to hold the result
    $result = '';

    //While we haven't reached the end of the string
    while($parser->CanConsume())
    {
        //Take all the text until the next '##' or the end of the string
        // and add to the result the string taken
        $result .= $parser->ConsumeUntil('##');
        //If we take a '##'
        if ($parser->Consume('##'))
        {
            //Take the text until the next whitespace or new line
            $tag = $parser->ConsumeUntil(array(' ', "\t", "\r", "\n"));
            //Add the new converted text to the result
            $result .= '<a>###'.$tag.'</a>';
        }
    }

    // example Hello how are <a>##you</a> ? I want <a>##join</a>you.
    echo $result;
?>

根据评论,这是一个修改后的版本,可以检测标记有任何给定字符串的单词(示例中为'##''**'):

function autolink($ptext, $detc)
{
    // declared whitespace for readability and performance
    $whitespace = array(' ', "\t", "\r", "\n");
    $parser = new Parser($ptext);
    $result = '';
    while($parser->CanConsume())
    {
        $result .= $parser->ConsumeUntil($detc);
        if ($parser->Consume($detc))
        {
            $newtag = $parser->ConsumeUntil($whitespace);
            $result .= '<a href='.$newtag.'>'.$newtag.'</a>';
        }
    }
    return $result;
}

使用示例:

echo autolink("Hello how are ##you ? I want **join you.", array('##', '**'));

输出:

Hello how are <a href=you>you</a> ? I want <a href=join>join</a> you.

在我的本地服务器上测试


备注

1)指令$parser->Consume($detc)将返回找到的字符串,因此您可以使用它来分支,例如:

$input = $parser->Consume(array('a', 'b'));
if ($input === 'a')
{
    // do something
}
else if ($input === 'b')
{
    // do something else
}
else /*if ($input === null)*/
{
    // fallback case
}

2)Consume支持的内容是:

  1. 给定字符串。
  2. 字符串数组。
  3. 数字(字符数)。
  4. Null(将使用单个字符)。
  5. 3)Parser对某些操作使用mb_*函数^,并期望UTF-8。如果您遇到编码问题,请在使用mb_internal_encoding('UTF-8');之前调用Parser并将字符串转换为UTF-8(我建议iconv执行此操作)。 ^:使用每字节字节操作优化其他一些部分。