PHP正则表达式:如果ucwords匹配,如何获取大写单词然后添加字符串?

时间:2010-10-29 10:59:00

标签: php regex

我有这个动态字符串

  

“ZAN ROAD HOG HEADWRAPS最多   流行的ZAN headwrap风格 - 功能   自定义和原创艺术品“

修改 如果我遇到一个ucwords()或标题案例单词,那么如何检查所有大写单词呢?那么我会在最后一个大写单词后面自动添加一个' - '? 注意:大写单词是产品名称,第一个ucwords()或标题大小写单词是产品描述的开头。

我现在有这个代码,但目前还没有工作:

<?php 
$str = preg_replace( '/\s+/', ' ', $sentence );
$words = array_reverse( explode( ' ', $str ) );
foreach ( $words as $k => $s ) {
    if ( preg_match( '/\b[A-Z]{5,}\b/', $s ) ) {
        $words[$k] = $s . " --";
        break;
    }
}
$short_desc = addslashes( trim( join( ' ', array_reverse( $words ) ) )); 
?>

提前致谢。

3 个答案:

答案 0 :(得分:2)

你可以这样做:

$str = preg_replace('/^(?:\p{Lu}+\s+)+(?=\p{Lu}*\p{Ll})/u', '$0-- ', $str);

此处^(?:\p{Lu}+\s+)+描述了字符串开头处的单词序列,这些单词由空格分隔,其中每个单词都是大写字母序列(\p{Lu},请参阅Unicode character properties)。前瞻断言(?=\p{Lu}*\p{Ll})只是为了确保实际存在包含小写字母的内容。

答案 1 :(得分:0)

您可以在字符串的开头查找大写字母:

$regexp = "/^([A-Z][A-Z\s]+)([A-Z].+)/";
$matches = $preg_match($regexp, $string);
$out = $matches[1] . "-- " . $matches[2];

第一个[A-Z]在行的开头查找大写字母
下一个[A-Z \ s] +查找1个或多个大写字母或空格
然后,[A-Z]。+随后查找剩余文本的第一个大写字母和任何字符。

我希望其余的行是自我解释的

-Pranav

答案 2 :(得分:0)

通过执行非全局替换(通知preg_replace()您只希望进行替换),可以避免使用^将样式锚定到输入字符串的开头。

插入字符串的目标位置紧跟在最后出现的“一个或多个大写字母后跟一个空格”之后。

不需要捕获组或引用。模式中的\K表示“重新开始完整字符串匹配”,换句话说就是“释放/忘记所有先前匹配的字符并从此开始匹配”。 ...那么我们就是不再匹配字符了-这将提供零长度位置以插入--。实际上,动作中不会丢失任何角色。

代码:(PHP Demo)(Regex Demo

$string = "ZAN ROAD HOG HEADWRAPS The most popular ZAN headwrap style-features custom and original artwork";
echo preg_replace('~(?:[A-Z]+ )+\K~', '-- ', $string, 1);

echo "\n---\n";

echo preg_replace('~^(?:[A-Z]+ )+\K~', '-- ', $string);  // without telling function to perform a single replacement

输出:

ZAN ROAD HOG HEADWRAPS -- The most popular ZAN headwrap style-features custom and original artwork
---
ZAN ROAD HOG HEADWRAPS -- The most popular ZAN headwrap style-features custom and original artwork

作为附带案例,如果您有一个以AI开头的产品说明,则该模式需要稍微加强以适应。这可以通过多种方式实现;对我来说,这似乎是简单/逻辑/直接的:(Regex Demo

~(?:[A-Z]+ )+\K(?=[A-Z])~