2011-05-27 133 views
-3

任何人都可以请帮助我扭转字符串中每个单词的正则表达式吗?REGEX以反向打印每个单词

样品输入:

Hello how are you my friend? 

所需的输出

olleH woh era uoy ym ?dneirf 

我想在PHP来实现这一点。

+5

是什么让你认为这只能使用正则表达式来完成? – kindall 2011-05-27 16:40:20

+1

希望你们的人们必须正确阅读我的问题。我从来没有提到它只能用REGEX来完成。我想要一个使用REGEX的解决方案,因为它速度很快。顺便说一句,@ Teneff:我有点常识,strrev函数不会像我在问题中提到的那样完成这项工作。 – 2011-05-27 16:45:39

+2

你是否有两种解决方案?我不确定正则表达式是否会在速度上赢得... – Blender 2011-05-27 16:58:45

回答

5

这给你几乎你想要的。

如果不够近,请查看空间上爆炸的Blender's solution

preg_replace_callback('/\b(\w+)\b/', function($match) { 
    return strrev($match[1]); 
}, $str); 

CodePad

您可以使用普通的正则表达式(和一些字符串函数)扭转文本,但它是丑陋的...

$length = strlen($str); 

echo preg_replace(
     '/' . str_repeat('(.)', $length) . '/s', 
     '$' . join('$', range($length, 1)), 
     $str 
    ); 

CodePad

上面的代码示例仅供演示。请不要使用它:)

+1

@Jared感谢您的编辑,也许我一直在观看过多的Futurama:P – alex 2011-05-27 16:57:51

+1

我很高兴您添加了“仅限演示”的一行。正则表达式是解决这个问题最糟糕的方式,尽管这个问题的任意要求是:| – meagar 2011-05-27 18:48:25

2

这不能在纯正则表达式,对不起。

这里有一个可能是工作的PHP脚本:

$exploded = explode(' ', $string); 
$temp = array(); 

for ($i = 0; $i < count(exploded); $i++) { 
    $temp[] = strrev(exploded[i]); 
} 

$temp = implode(' ', $temp); 
+3

@ Coding-Freak请对您的堆栈溢出同行予以礼貌。 – alex 2011-05-27 16:54:30

+2

我不确定你的意思。 @ Alex的回答并没有完全用正则表达式来完成,因为回调函数用于反转实际的字符串。在说“带正则表达式”时,你应该更清楚一些,因为我认为你的意思是只有*正则表达式。 – Blender 2011-05-27 16:55:45

+1

您的explode调用缺少分隔符参数。爆炸('',$ string)'。连接$ temp时,您可能还想要将空格放回。 – cOle2 2011-05-27 16:55:48

0

不是正则表达式,但这个工程:

<?php 

function reverseWords($text) { 
    $words = explode(' ', $text); 
    $c_words = count($words); 
    $outtext = ""; 
    for ($i = 0; $i < $c_words; $i++) { 
     if ($i !== 0) $outtext .= " "; 
     $length = strlen($words[$i]); 
     for ($p = $length-1; $p >= 0; $p--) { 
      $outtext .= substr($words[$i], $p, 1); 
      $start--; 
     } 
    } 
    return $outtext; 
} 

echo reverseWords("This is a test."); 

?> 

https://ideone.com/WUtzJ

现在,我忘了strrev(),这样就会缩短一点点。

编辑

使用strrev()

<?php 

function reverseWords($text) { 
    $words = explode(' ', $text); 
    $c_words = count($words); 
    $outtext = ""; 
    for ($i = 0; $i < $c_words; $i++) { 
     if ($i !== 0) $outtext .= " "; 
     $outtext .= strrev($words[$i]); 
    } 
    return $outtext; 
} 

echo reverseWords("This is a test."); 

?> 

https://ideone.com/NT7A5

0

这是非常琐碎实现无正则表达式,我在这里看到了很多大规模的解决方案,所以我以为我会张贴一行:

$rev = implode(' ', array_map('strrev', explode(' ', $string)));