我有这个动态字符串
“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 ) ) ));
?>
提前致谢。
答案 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
作为附带案例,如果您有一个以A
或I
开头的产品说明,则该模式需要稍微加强以适应。这可以通过多种方式实现;对我来说,这似乎是简单/逻辑/直接的:(Regex Demo)
~(?:[A-Z]+ )+\K(?=[A-Z])~