0

我有一个字符串,它们是捆绑在一起的单词,我需要将它们分开,每个以“A”结尾的单词可能应该换行,

item onea second itema third

我还需要检查以“A”结尾的单词是否应该以“A”结尾,例如额外或苏丹娜。

item oneasecond itemand an extra item

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

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

4

4 回答 4

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 ,其中填充了从原始字符串中拆分出来的字符串。

更新:修复了代码中的几个错别字。

于 2009-10-07T12:08:54.627 回答
0

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

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

如果它们用空格分隔。

然后您可以遍历数组$words并检查每个数组是否有最终的“a”,如有必要,请对其进行修剪。

preg_replace()并不总是能满足您的文本操作需求。

编辑:如果你要使用thenpreg_replace的每个元素$words

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

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

另外,我们没有考虑到您以“a”结尾的大约 2900 个单词的列表(其中一些我什至从未听说过

于 2009-10-07T11:49:11.203 回答
0

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

于 2009-10-07T11:55:37.340 回答
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
于 2009-10-07T12:05:23.177 回答