我需要使用str_replace [not regex]将lib_someString
转换为文本块中的<a href="someString">someString</a>
。
这是一个准确判断我的意思的示例:lib_12345
=&gt; <a href="12345">12345</a>
。我需要在一个文本块中为一堆实例执行此操作。
以下是我的尝试。我得到的问题是我的函数没有做任何事情(我只是返回了lib_id)。
function extractLibId($val){ // function to get the "12345" in the above example
$lclRetVal = substr($val, 5, strlen($val));
return $lclRetVal;
}
function Lib($text){ // does the replace for all lib_ instances in the text
$lclVar = "lib_";
$text = str_replace($lclVar, "<a href='".extractLibId($lclVar)."'>".extractLibId($lclVar)."</a>", $text);
return $text;
}
答案 0 :(得分:2)
Regexp会更快更清晰,你不需要为每个可能的'lib_'字符串调用你的函数:
function Lib($text) {
$count = null;
return preg_replace('/lib_([0-9]+)/', '<a href="$1">$1</a>', $text, -1, $count);
}
$text = 'some text lib_123123 goes here lib_111';
$text = Lib($text);
没有正则表达式,但每次在某个地方调用Lib2都会死于可爱的小猫:
function extractLibId($val) {
$lclRetVal = substr($val, 4);
return $lclRetVal;
}
function Lib2($text) {
$count = null;
while (($pos = strpos($text, 'lib_')) !== false) {
$end = $pos;
while (!in_array($text[$end], array(' ', ',', '.')) && $end < strlen($text))
$end++;
$sub = substr($text, $pos, $end - $pos);
$text = str_replace($sub, '<a href="'.extractLibId($sub).'">'.extractLibId($sub).'</a>', $text);
}
return $text;
}
$text = 'some text lib_123123 goes here lib_111';
$text = Lib2($text);
使用preg_replace。
答案 1 :(得分:1)
虽然可以在没有正则表达式的情况下执行所需操作,但是由于性能原因,您说您不想使用它们。我怀疑其他解决方案会更快,所以这里有一个简单的正则表达式来对照:
echo preg_replace("/lib_(\w+)/", '<a href="$1">$1</a>', $str);
答案 2 :(得分:1)
忽略优化这个的荒谬区域,即使是最简单的实现,最少的验证也只需要比正则表达式少33%的时间
<?php
function uselessFunction( $val ) {
if( strpos( $val, "lib_" ) !== 0 ) {
return $val;
}
$str = substr( $val, 4 );
return "<a href=\"{$str}\">{$str}</a>";
}
$l = 100000;
$now = microtime(TRUE);
while( $l-- ) {
preg_replace( '/^lib_(.*)$/', "<a href=\"$1\">$1</a>", 'lib_someString' );
}
echo (microtime(TRUE)-$now)."\n";
//0.191093
$l = 100000;
$now = microtime(TRUE);
while( $l-- ) {
uselessFunction( "lib_someString" );
}
echo (microtime(TRUE)-$now);
//0.127598
?>
答案 3 :(得分:-1)
如果你被限制使用正则表达式,你将很难找到你描述为“someString”的字符串,即事先并不准确知道。例如,如果您知道字符串正好是lib_12345,那么将$ lclVar设置为该字符串。另一方面,如果您事先不知道确切的字符串,则必须通过preg_replace()或类似函数使用正则表达式。