在第一个连字符之前隔离字符串的前导部分并从匹配中省略任何尾随空格

Posted

技术标签:

【中文标题】在第一个连字符之前隔离字符串的前导部分并从匹配中省略任何尾随空格【英文标题】:Isolate leading portion of string before first hyphen and omit any trailing spaces from match 【发布时间】:2016-10-28 04:48:22 【问题描述】:

我有从字符串中提取标题的工作代码,但现在它仍然不是很灵活。

当前代码:

$post_title = "THIS IS A TEST - 10-01-2010 - HELLO WORLD (OKAY)!!";
$post_title = substr($post_title, 0, strpos($post_title, '-') - 1);

我想获取字符串的标题,它位于字符串的开头,一直到第一个破折号。我不想在破折号之前得到空格,可能根本没有破折号。

当前代码的输出有效,输出THIS IS A TEST,但是当前代码不适用于以下情况,所以需要更灵活的代码:

这是一个测试 - 2010 年 10 月 1 日 - 你好世界(好的)!! 这是一个测试 - 10-01-2010 - HELLO WORLD (OKAY)!! 这是一个测试 - - - - 10-01-2010 - HELLO WORLD (OKAY)!! 这是一个测试

所以标题可以在没有- 的情况下存在,并且有人可能会忘记在- 之间放置一个空格,同样,有人可能会放置太多空格。

上述所有情况的输出应始终为THIS IS A TEST,末尾没有空格。

使用我拥有的代码,唯一有效的是第一个。

$title= explode('-', $post_title);
$post_title=trim($title[0]);
$trimmedTitle=$post_title;

$str = "THIS IS A TEST -0-01-2010 - HELLO WORLD (OKAY)!!";
preg_match("/^([\w\s]+)\s*-?/m", $str, $m);
print_r($m);

【问题讨论】:

您可能想为此使用一个简单的正则表达式。将您的示例标题放入 regex101.com 并使用右下角的快速参考来尝试一下。 @Rizier123 我希望我能 Rizier123,我已经在这方面花费了很多时间,甚至更多,我的老板在我的脖子上喘不过气来。我的解决方案有效,但它会产生很多问题,因为我必须手动修复错误。这是 SOF 又一个巨大的希望堡垒。周末工作:( @Anant 会是这样吗if(strpos($string,'$post_title'))echo explode('$post_title',$string)[0]; 我可能没有提到$post_title' 是wordpress 帖子的标题,因此它会根据帖子而改变。谢谢,我正在测试。 @Anant 案例 2 和案例 4 都不起作用。(案例 4 和 2 删除了 1 个字母)THIS IS A TES @Anant 抱歉一会儿。我只是解决它。拜托,我想是我。 【参考方案1】:

如果您打算使用explode(),那么最好将输出数组中的元素数量限制为 2——因为您只对第一个元素感兴趣。想一想,如果您不打算使用它们,为什么还要费心在文本中的任何后续连字符上爆炸?

$str = "THIS IS A TEST -0-01-2010 - HELLO WORLD (OKAY)!!";
$parts = explode($str, '-', 2);
$post_title = rtrim($parts[0]);

...但是我不喜欢这种技术有两点:

    输入是一个字符串,输出是一个字符串,但是您正在填充一个数组并且 看看你必须如何采取额外的步骤来清理标题末尾的任何挥之不去的空格

出于这个原因,我建议使用preg_replace() 直接修剪不需要的字符,而不生成任何数组,也不需要任何额外的清理。

代码:(php Demo) (Pattern Demo)

$str = "THIS IS A TEST -0-01-2010 - HELLO WORLD (OKAY)!!";
var_export(preg_replace('~ *-.*~', '', $str));

输出:

'THIS IS A TEST'

该模式表示,匹配零个或多个空格,然后是第一个出现的连字符,然后匹配零个或多个字符,直到行/字符串的末尾。

【讨论】:

【参考方案2】:

使用带有“-”作为分隔符的explode()根据“-”的存在将其拆分为块,然后取第一部分并使用trim()修剪尾随空格以赋予标题没有尾随空格。这在所有提供的测试用例中给出了“这是一个测试”。如果没有破折号,则返回整个字符串。

<?php

    $str = 'THIS IS A TEST - 10-01-2010 - HELLO WORLD (OKAY)!!';
    $title= explode('-', $str);
    $trimmedTitle=trim($title[0]);
    print_r($trimmedTitle);

    //$trimmedTitle ='THIS IS A TEST 

?>

我已经对此进行了测试:

THIS IS A TEST - 10-01-2010 - HELLO WORLD (OKAY)!!
THIS IS A TEST-10-01-2010 - HELLO WORLD (OKAY)!!
THIS IS A TEST - - - - 10-01-2010 - HELLO WORLD (OKAY)!!
THIS IS A TEST

每个都返回 THIS IS A TEST 没有尾随空格

【讨论】:

乐于助人 - 使用此方法的优点是您还可以访问字符串中的其余信息 - 例如发布日期和发布内容。只需访问 $title 数组的不同部分 @Arthor 如果THIS IS A TEST 位于字符串的中间部分,则上述方法将不起作用,例如:- THIS IS WORKING -THIS IS A TEST - 10-01-2010 - HELLO WORLD (OKAY)!! @Anant - 这是真的 - 但 OP 声明“我想获取字符串的标题,它位于字符串的开头,直到第一个破折号。”所以想法是获取字符串的第一部分,因为那是帖子标题的位置。 @gavgrif 我不反对你。我只想告诉他,如果在任何情况下将来的位置发生变化,那么还需要做更多的工作。

以上是关于在第一个连字符之前隔离字符串的前导部分并从匹配中省略任何尾随空格的主要内容,如果未能解决你的问题,请参考以下文章

路径模式错误之前是不是有前导“/”?

REGEX - 在字符串之间查找文本 - 第一个可选,但在第一个匹配之前只有第二个

phplinuxjavascript 正则表达式

AngularJs UI typeahead 匹配前导字符

正则表达式删除字符前字符串中间的空格

将整个单词与字符串中的前导或尾随特殊符号(如美元)匹配