【问题标题】:How to get the index of last word with an uppercase letter in PHP如何在PHP中使用大写字母获取最后一个单词的索引
【发布时间】:2017-07-13 07:11:55
【问题描述】:

考虑这个输入字符串:

“这是一个测试字符串,用于在 PHP 中获取带有大写字母的单词的最后索引”

如何获取“PHP”单词的最后一个大写字母的位置(在本例中是第一个“P”(不是最后一个“P”)的位置?

【问题讨论】:

  • 您说“我能得到最后一个大写字母的位置吗”,并且在括号中您提到了“PHP”单词的第一个“P”,它不是最后一个大写字母。那么你真正需要的是什么?另外,你有没有试过分享什么?
  • 这似乎工作regex101.com/r/KkJeho/1
  • 等等.. 位置是什么意思?就像您从 strpos 获得的字符数一样?你为什么要标记这个正则表达式?正则表达式不会给你计数
  • @user467801 您的问题有“不清楚您在问什么”的风险。有很多方法可以解决您的问题,但如果没有更多细节,我们无法绝对确定准确性。请再提供 3 到 5 个样本输入,这些样本输入呈现边缘情况场景以及每个样本的预期输出。这将帮助志愿者了解您的文本的可变性,并使我们能够自信地为您编写可靠的模式/解决方案。您的问题越好,我们的回答就越好。

标签: php regex substring offset uppercase


【解决方案1】:

我认为这个正则表达式有效。试试看。

https://regex101.com/r/KkJeho/1

$pattern = "/.*\s([A-Z])/";
//$pattern = "/.*\s([A-Z])[A-Z]+/"; pattern to match only all caps word

编辑以解决 Wiktor 在 cmets 中写的内容我认为您可以将所有带有空格的新行替换为正则表达式中的输入字符串。
这应该使正则表达式将其视为单行正则表达式,并且仍然给出正确的输出。
虽然没有测试。

要查找字母/单词的位置:

$str = "this is a Test String to get the last index of word with an uppercase letter in PHP";

$pattern = "/.*\s([A-Z])(\w+)/";
//$pattern = "/.*\s([A-Z])([A-Z]+)/";  pattern to match only all caps word

preg_match($pattern, $str, $match);


$letter = $match[1];
$word = $match[1] . $match[2];
$position = strrpos($str, $match[1].$match[2]);

echo "Letter to find: " . $letter . "\nWord to find: " . $word . "\nPosition of letter: " . $position;

https://3v4l.org/sJilv

【讨论】:

  • "/.*\s([A-Z])/" 将起作用,除非字符串是多行的,并且最后一个 capitalized 单词在第一个以外的行上。或者,如果大写单词前面只是一个非单词字符而不是空格。顺便说一句,OP 不想只匹配 ALLCAPS 单词吗?
  • @Wiktor 是真的。但我不知道OP想要什么。他还说“位置”,这使reges或多或少无用。
  • @Wiktor 我想我已经解决了你的两个问题 :-)
  • 另外,如果是一个单词的句子,那也行不通。如果前面的字母不是空格(即Written in PHP/Java),将其更改为.*\b[A-Z] 将解决。另一个问题是 它没有回答问题!这匹配/找到最后一个大写的单词/字母,但它没有给出该字符的 位置
  • 哇...放轻松。我只是提出了一个我相信会稍微改进你的正则表达式的建议,并指出了一个事实。这不像是我指责你图谋窃取皇冠上的珠宝;)
【解决方案2】:

如果您还想考虑非正则表达式版本:您可以尝试在空白字符处拆分字符串,向后迭代生成的字符串数组并检查当前字符串的第一个字符是否为大写字符,如下所示 (您可能需要添加索引/空值检查):

<?php    

$str =  "this is a Test String to get the last index of word with an uppercase letter in PHP";
$explodeStr = explode(" ",$str);
$i = count($explodeStr) - 1;
$characterCount=0;
while($i >= 0) {
    $firstChar = $explodeStr[$i][0];
    if($firstChar == strtoupper($firstChar)){
        echo $explodeStr[$i]. ' at index: ';
        $idx = strlen($str)-strlen($explodeStr[$i] -$characterCount);
        echo $idx;
        break;
    }
    $characterCount += strlen($explodeStr[i]) +1; //+1 for whitespace
    $i--;
} 

这会打印出80,这确实是PHP 中第一个P 的索引(包括空格)。

【讨论】:

  • 我觉得这是一个很好的答案。为什么它被否决了?它实际上给出了位置,而我没有。并且是免费的正则表达式(除非它是一个高字符串)可能使它更快。来自我的 +1!
  • 我猜是因为这个问题实际上被标记为正则表达式..但是谢谢! :)
  • 我认为OP没有决定方法。如果是这种情况,将有数百个线程在解析 html 时使用正则表达式答案。但是没有。
【解决方案3】:

Andreas 的模式看起来很稳固,但这会更快找到位置...

.* \K[A-Z]{2,}

Pattern Demo

这里是 PHP 实现:Demo

$str='this is a Test String to get the last index of word with an uppercase letter in PHP test';
var_export(preg_match('/.* \K[A-Z]{2,}/',$str,$out,PREG_OFFSET_CAPTURE)?$out[0][1]:'fail');
// 80

如果您想查看一个精简的非正则表达式方法,这将起作用:

代码:Demo

$str='this is a Test String to get the last index of word with an uppercase letter in PHP test';
$allcaps=array_filter(explode(' ',$str),'ctype_upper');
echo "Position = ",strrpos($str,end($allcaps));

输出:

Position = 80

这假设输入字符串中有一个全部大写的单词。如果有可能没有全大写的单词,那么条件语句会对其进行排序。


编辑,在重新阅读问题后,我不确定究竟是什么使 PHP 成为目标子字符串 - 无论是因为它全部大写,还是只是以大写字母开头的最后一个单词。

如果只是最后一个单词以大写字母开头,那么这个模式就可以:/.* \K[A-Z]/

如果单词需要全部大写,则可能需要/b 单词边界。

来自 OP 的更多示例和解释会很有用。


另一个编辑,您可以声明一组要排除的字符并仅使用两个字符串函数。我正在使用a-z 和带有rtrim() 的空格,然后找到最右边的空格,并将1 添加到其中。

$str='this is a Test String to get the last index of word with an uppercase letter in PHP test';
echo strrpos(rtrim($str,'abcdefghijklmnopqrstuvwxyz '),' ')+1;
// 80

【讨论】:

    猜你喜欢
    • 2020-02-03
    • 1970-01-01
    • 2021-04-29
    • 2020-04-22
    • 2016-07-28
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多