2011-05-27 78 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)));