我想取一个字符串并找出特定的单词并将它们大写。因此,对于像“Lorem ipsum dolor sit amet, consectetur adipisicing elit.”这样的字符串,我希望能够只使用 ipsum 和 adipisicing。所以基本上对某些单词进行大写过滤。
如何才能做到这一点?
我想取一个字符串并找出特定的单词并将它们大写。因此,对于像“Lorem ipsum dolor sit amet, consectetur adipisicing elit.”这样的字符串,我希望能够只使用 ipsum 和 adipisicing。所以基本上对某些单词进行大写过滤。
如何才能做到这一点?
不要为此使用正则表达式,这str_replace
是最清晰、最简单的方法:
$str = str_replace(
array('ipsum','adipisicing'),
array('Ipsum','Adipisicing'),
'Lorem ipsum dolor sit amet, consectetur adipisicing elit.'
);
或者更聪明一点:
$words = array('ipsum', 'adipisicing');
$str = str_replace($words, array_map('ucfirst', $words), 'Lorem ipsum dolor sit amet, consectetur adipisicing elit.');
有太多方法可以做到这一点......
str_replace
,然后将数组分解回一个字符串$capitalize_me = array('word1','word2'....'wordn');
$capitaliazed = array_map('ucfirst',$capitalize_me);
$new_sentence = str_replace($capitalize_me,$capitalized,$old_sentence);
不是最有效的,但确实有效
这对我很有效:
<?php
$word_array = array('ipsum', 'adipisicing');
$soucre_sentence = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit.';
$captilize_words = array();
$replacements_captalized = array();
$replacements_all_caps = array();
foreach ($word_array as $word) {
$captilize_words[] = '/\b' . $word . '\b/i';
$replacements_captalized[] = ucfirst(strtolower($word));
$replacements_all_caps[] = strtoupper($word);
}
$ret = preg_replace($captilize_words, $replacements_all_caps, $soucre_sentence);
echo $ret;
?>
添加大写和全部大写替换,因为我不清楚您真正希望输出是什么。选一个!
编辑:真的不知道array_map
(那个@mmattax)的灵活性,最后一次用那个技巧重新设计了它。
<?php
$word_array = array('ipsum', 'adipisicing');
$soucre_sentence = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit.';
$captilize_words = array_map(function ($word) { return '/\b' . $word . '\b/i'; }, $word_array);
$replacements_captalized = array_map('ucfirst', $word_array);
$replacements_all_caps = array_map('strtoupper', $word_array);
$ret = preg_replace($captilize_words, $replacements_all_caps, $soucre_sentence);
echo $ret;
?>
$str = 'Lorem ipsum dolor sit amet, consectetur adipisicing elit.';
$caps = 'ipsum|adipisicing';
echo preg_replace_callback(
'/(^|\s)('.$caps.')(\s|$)/'
, function($m){ return $m[1].ucfirst($m[2]).$m[3]; }
, $str
);
那个正则表达式可能会更好(我想你可以使用 \W),但如果你不考虑单词之前/之后的空格,它也会在单词中间替换。