将lib_string转换为<a href="string">string</a> w / o Regex

时间:2011-11-15 20:31:38

标签: php

我需要使用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;
}

4 个答案:

答案 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);

如下所示:http://codepad.org/xGj78r9r

答案 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()或类似函数使用正则表达式。