2012-01-17 4 views
1

このテキストを有効にします:ucwordsをアポストロフィではなくシングルクォートだけにするにはどうすればいいですか?

「解決策を見つける」と言っています。このテキストに

彼女は、それは 'ソリューションを探す' する時が来たと言っています。 (私はphp.netのcomment sectionで見つかった。)

function ucwordsMore ($str) { 
    $str = str_replace("' ","'",ucwords(str_replace("'","' ",$str))); 
    return $str; 
} 

ただし、この機能を:私は現在、両方ucwordsと単一引用符の後に大文字を作るために、このucwords関連の機能を使用してい

彼女は「解決策を見つける時間」と言います。

どのように私は最高のアポストロフィ小さな、および大きな単一引用符の後文字の後に手紙を保つことができますか?

答えて

3

これは通常、パターンマッチングのビットで動作します:

$str = preg_replace("/\w[\w']*/e", "ucwords('\\0')", $str); 

\wは、ASCII文字と数字のために大丈夫です。国際テキストの場合は、\pL/u修飾子を使用します。

+0

魅力的な作品です!ありがとうございました! –

+0

+1 - 一般的に、私は '/ e'修飾子から遠ざかりたいが、これは非常に洗練された解決策である。 – FtDRbwLXw6

+0

Mario、この例ではどうやってpLとuを使いますか?英語以外の文字の手前の文字も大きくなるためです。申し訳ありません...私は正規表現の専門家ではありません... –

0

申し訳ありませんが、一重引用符とアポストロフィの間に違いはありません。それが意味を成すならば、あなたはその2つを区別するために何かを使わなければならないでしょう。あなたが使うことができるヒューリスティックは、アポストロフィの後に1つまたは2つの連続した文字がある場合は、単一引用符で囲まれた文字列ではなく、収縮であると考えることができます。

編集:これは私がお勧めしない愚かなヒューリスティックですが、私はとにかくそれを行いました。

function ucwordsMore ($str) { 
    $str = str_replace("' ","'",ucwords(str_replace("'","' ",$str))); 
    return $str; 
} 

$string = "She's Saying It's Time To 'Find A Solution'."; 

$string = ucwordsMore($string); 
//string now equals = She'S Saying It'S Time To 'Find A Solution'. 
for($i = 0; $i < strlen($string); $i++){ 
    if($string[$i] == "'"){ 
     if($i +2 < strlen($string) && $string[$i] == "'"&& $string[$i+1] != " "&& $string[$i+2] == " "){ 
      $string[$i+1] = strtolower($string[$i+1]); //replace 
    } 
     if($i +3 < strlen($string) && $string[$i] == "'"&& $string[$i+1] != " "&& $string[$i+2] != " "&& $string[$i+3] == " "){ 
      $string[$i+1] = strtolower($string[$i+1]); //replace 
      $string[$i+2] = strtolower($string[$i+2]); //replace 
    } 

} 
} 
echo $string; 
//$string - "She's Saying It's Time To 'Find A Solution'." 
+0

私は知っている、質問は何ですか? –

+0

あなたが使用できるヒューリスティックについての編集を追加しました。もっと正確にしたいのであれば、基本的に大文字にしたくない単語の配列を作成し、リストを反復するときに確認することができます。基本的に一重引用符を使用しているのは、二重引用符を使用する必要があるものです。 – jakx

+0

答えではなくコメントでなければなりません...そして、より正確で代替的なヒューリスティックは、アポストロフィの前にスペースの有無があります。 –

-1
$str = ucwords($str); 

$str = preg_replace_callback("/(^|\\s+)'[a-z]/", create_function(
    '$matches', 
    'return strtoupper($matches[0]);' 
), $str); 
関連する問題