preg_replace不显示没有网址的文本

时间:2014-07-07 22:22:30

标签: php regex preg-replace

晚上好..我能够成功地将网址文本更改为链接,但是在显示没有网址的文字时遇到问题..它只是没有显示,因为它没有网址它...

尝试过并试过。请帮帮我。谢谢

    <?php 
$textorigen = $row_get_tweets['tweet'];

// URL starting with http://
$reg_exUrl = "/(^|\A|\s)((http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,4}   (\/\S*)?)/";
if(preg_match($reg_exUrl, $textorigen, $url)) {

 // make the urls hyper links
 $text_result=preg_replace( $reg_exUrl, "$1<a href=\"$2\">$2</a> ", $textorigen );
 $textorigen=$text_result;

 } else {

 // if no urls in the text just return the text
 $text_result=$textorigen;
 }   

  // URL starting www.
  $reg_exUrl = "/(^|\A|\s)((www\.)[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,4}(\/\S*)?)/";
  if(preg_match($reg_exUrl, $text_result, $url)) {

   // make the urls hyper links
   $text_result=preg_replace( $reg_exUrl, "$1<a href=\"http://$2\">$2</a>",    $text_result );
   $textorigen=$text_result;

  echo $textorigen;
   }
  ?>

2 个答案:

答案 0 :(得分:1)

在使用preg_match之前,无需使用preg_replace进行测试。 preg_replace仅在匹配时才会替换。

因此,您的if-then-else结构可以简化为:

$replaced = preg_replace($regex,$replacement,$original);

答案 1 :(得分:0)

关于正则表达式模式:很难找到有效描述网址的最佳模式(准确性和性能之间的折衷)。这就是为什么一种方法使用URL的基本描述来做到这一点的原因。

关于代码:您可以更有效地使用preg_replace_callback解析字符串一次,例如:

$textorigen = <<<'DATA'
abcd http://example.com efgh (ftps://example2.com/) ijkl www.example3.com
DATA;

$pattern = '~(?<=^|\s|\pP)(?:(ht|f)tps?://|www\.)\S+(?<![^\PP?/])(?=\s|$|\pP)~i';

$textorigen = preg_replace_callback($pattern, function ($m) {
                   $link = ($m[1])? $m[0] : 'http://' . $m[0];
                   return '<a href="' . $link . '">' . $link . '</a>'; },
                                    $textorigen);
echo $textorigen;

模式描述:

~                  #  pattern delimiter
(?<=^|\s|\pP)      #  lookbehind : preceded by the start of the string
                   # or a whitespace character or a punctuation character
(?:                #  non capturing group
    (ht|f)tps?://  #  scheme
  |                #  OR
    www\.          #  www.
)
\S+                #  one or more non whitespace characters 
(?<![^\PP?/])      #  that don't end with a punctuation character
                   # except "?" and "/"
(?=\s|$|\pP)       #  followed by a whitespace, the end of the string
                   # or a punctuation character
~i                 #  end delimiter, the pattern is case insensitive