另一个preg_replace问题!

时间:2009-10-07 11:17:02

标签: php design-patterns preg-replace text-manipulation

我有一个串在一起的字符串,我需要将它们分开,每个以'A'结尾的单词应该在一个新行上,

item onea second itema third

我还需要检查以'A'结尾的单词是否应该实际上以'A'结尾,如extra或sultana。

item oneasecond itemand an extra item

我在这个网站http://www.morewords.com/ends-with/a中有一个以'A'结尾的单词数组,所以我只需要preg_replace函数。

每当有人在这里回答问题时,我真的在学习,所以再次感谢每个人的时间和耐心

4 个答案:

答案 0 :(得分:1)

你可以这样做:

// assoc array keyed on words that end with A
$endsWithA = array("sultana" => 1, ...); 

$words = split(' ', $string);

$newString = '';
$finalStrings = array();

foreach ($words AS $w) {    
    // if it ends with a, check to see if it's a real word.
    // if so, end the current string and store it
    if (preg_match("/a$/", $w) && !$endsWithA[$w]) {
        $w = preg_replace("/a$/","", $w);
        $newString .= $w;
        $finalStrings[] = $newString;
        $newString = '';
    }
    else {
        $newString .= $w . ' ';
    }    
}

// Get any remaining newString
if ($newString) $finalStrings[] = trim($newString);

print_r($finalStrings);

没有测试过,等等,但它会给你一个数组$ finalStrings,其中填充了从原文中拆分的字符串。

更新:修复了代码中的几个拼写错误。

答案 1 :(得分:0)

考虑到explode()字符串可能有用,以便将其分隔为单词数组:

$words = explode(' ', $string);

如果他们被空格隔开。

然后你可以循环遍历数组$words并检查每个数组的最后一个'a',如果有必要,可以进行缩放。

preg_replace()并不总能解决您的文本操作需求。

编辑:如果您对preg_replace的每个元素使用$words,那么

foreach ($words as $word) {
    $word = preg_replace('/(\w)a$/', '\1', $word);
}

注意,我没有尝试过这个,如果这实际上更改数组,我现在不记得了,但我认为正则表达式应该是正确的。重要的概念是 a $ ,即单字符串的 end 处的字母a。我认为这是替换字母(\w)的正确语法,后面跟一个字母字符串末尾的'a'但是这里很晚了我的大脑可能无法正常工作

另外,我们没有考虑你的约2900个以'a'结尾的单词列表(其中一些我从来没有听到

答案 2 :(得分:0)

这听起来更像是 preg_match 的作业。

答案 3 :(得分:0)

不确定'的含义是什么,以'A'结尾的每个单词都应该在新行上'。如果你在输入字符串之外发布实际输出,总是很有用。

你的意思是以'a'结尾的单词后跟一个新行(1)?或者以'a'结尾的单词应该在它之前有一个新行?或者也许是两者的组合,将一个以'a'结尾的单词放在他们自己的行上(在单词之前和之后放置换行符)?

$words = "item onea second itema third";
print_r(preg_split("/\s+(?=\S+a)/i", $words));           // 1
print_r(preg_split("/(?<=a)\s+/i", $words));             // 2
print_r(preg_split("/(?<=a)\s+|\s+(?=\S+a)/i", $words)); // 3