我有我的工作代码,从字符串中提取标题,但现在它仍然不是很灵活。
当前代码:$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
,但当前代码不适用于以下情况,因此我需要更灵活的代码:
- 这是一个测试- 10-01-2010 -你好,世界(好的)!这是一个测试-10-01-2010 -你好,世界(好的)!
- 这是一个测试- - - - 10-01-2010 -你好,世界(好的)!! 这是一个测试
所以标题可以没有-
,有人可能忘记在-
之间加空格,同样,有人可能放了太多空格。
以上所有情况的输出都应该始终是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("/^([ws]+)s*-?/m", $str, $m);
print_r($m);
使用带"-"的explosion()作为分隔符,根据"-"的存在将其分割成块,然后取第一部分并使用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,没有尾随空格
如果您打算使用explode()
,那么最佳实践是将输出数组中的元素数量限制为2—因为您只对第一个元素感兴趣。想想看,如果你不打算使用连字符,为什么还要在文本中使用连字符呢?
$str = "THIS IS A TEST -0-01-2010 - HELLO WORLD (OKAY)!!";
$parts = explode($str, '-', 2);
$post_title = rtrim($parts[0]);
…但是有两件事我不喜欢这个技巧:
- 输入是一个字符串,输出也是一个字符串,但是你正在填充一个数组,
- 看看你是如何采取额外的步骤来清除标题末尾的任何留白的
出于这个原因,我建议使用preg_replace()
直接修剪不需要的字符,而不生成任何数组,也不需要任何额外的清除。
$str = "THIS IS A TEST -0-01-2010 - HELLO WORLD (OKAY)!!";
var_export(preg_replace('~ *-.*~', '', $str));
输出:'THIS IS A TEST'
模式表示,匹配第一个出现的连字符后面的零个或多个空格,然后匹配零个或多个字符,直到行/字符串的末尾。