<?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.
?>
现在我要用##替换所有## ....单词..... 例子你好##你好吗?我想##加入你。
答案 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
支持的内容是:
3)Parser
对某些操作使用mb_*
函数^,并期望UTF-8
。如果您遇到编码问题,请在使用mb_internal_encoding('UTF-8');
之前调用Parser
并将字符串转换为UTF-8(我建议iconv
执行此操作)。 ^:使用每字节字节操作优化其他一些部分。