在第一个连字符之前隔离字符串的前导部分,并从匹配中省略任何尾随空格
Isolate leading portion of string before first hyphen and omit any trailing spaces from match
我有从字符串中提取标题的工作代码,但现在它仍然不是很灵活。
当前代码:
$post_title = "THIS IS A TEST - 10-01-2010 - HELLO WORLD (OKAY)!!";
$post_title = substr($post_title, 0, strpos($post_title, '-') - 1);
我想获取字符串的标题,它位于字符串的开头,一直到第一个破折号。我不想在破折号之前得到 spaces,可能根本就没有破折号。
当前代码的输出有效并输出THIS IS A TEST
,但当前代码不适用于以下情况,因此我需要更灵活的代码:
- 这是一个测试 - 10-01-2010 - 你好世界(好的)!!
- 这是一个 TEST-10-01-2010 - HELLO WORLD(好的)!!
- 这是一个测试 - - - - 10-01-2010 - 你好,世界(好的)!!
- 这是一个测试
所以标题可以没有 -
而有人可能会忘记在 -
之间放一个 space,同样,有人可能会放太多 space .
上述所有情况的输出应始终为 THIS IS A TEST
,末尾没有 space。
根据我的代码,唯一有效的是第一个。
$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);
使用以“-”作为分隔符的 explode() 根据“-”的存在将其分成块,然后取出第一部分并使用 trim() 到 trim 尾随空格以提供没有尾随空格的标题。这在所有提供的测试用例中给出 "THIS IS A TEST"。如果没有破折号,则返回整个字符串。
<?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
每个 returns 这是一个没有尾随空格的测试
如果您打算使用 explode()
,那么最佳做法是将输出数组中的元素数量限制为 2——因为您只对第一个元素感兴趣。想一想,如果您不打算使用它们,为什么还要在文本中的任何后续连字符上爆炸?
$str = "THIS IS A TEST -0-01-2010 - HELLO WORLD (OKAY)!!";
$parts = explode($str, '-', 2);
$post_title = rtrim($parts[0]);
...但是有两点我不喜欢这种技术:
- 输入是一个字符串,输出也是一个字符串,但是您在整个过程中填充了一个数组,并且
- 看看你必须如何采取额外的步骤来清除标题末尾的任何残留空间
出于这个原因,我建议使用 preg_replace()
直接 trim 不需要的字符,而不生成任何数组,也不需要任何额外的清理。
代码:(PHP Demo) (Pattern Demo)
$str = "THIS IS A TEST -0-01-2010 - HELLO WORLD (OKAY)!!";
var_export(preg_replace('~ *-.*~', '', $str));
输出:
'THIS IS A TEST'
该模式表示,匹配零个或多个空格,后跟第一个出现的连字符,然后匹配零个或多个字符,直到 line/string.
结束
我有从字符串中提取标题的工作代码,但现在它仍然不是很灵活。
当前代码:
$post_title = "THIS IS A TEST - 10-01-2010 - HELLO WORLD (OKAY)!!";
$post_title = substr($post_title, 0, strpos($post_title, '-') - 1);
我想获取字符串的标题,它位于字符串的开头,一直到第一个破折号。我不想在破折号之前得到 spaces,可能根本就没有破折号。
当前代码的输出有效并输出THIS IS A TEST
,但当前代码不适用于以下情况,因此我需要更灵活的代码:
- 这是一个测试 - 10-01-2010 - 你好世界(好的)!!
- 这是一个 TEST-10-01-2010 - HELLO WORLD(好的)!!
- 这是一个测试 - - - - 10-01-2010 - 你好,世界(好的)!!
- 这是一个测试
所以标题可以没有 -
而有人可能会忘记在 -
之间放一个 space,同样,有人可能会放太多 space .
上述所有情况的输出应始终为 THIS IS A TEST
,末尾没有 space。
根据我的代码,唯一有效的是第一个。
$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);
使用以“-”作为分隔符的 explode() 根据“-”的存在将其分成块,然后取出第一部分并使用 trim() 到 trim 尾随空格以提供没有尾随空格的标题。这在所有提供的测试用例中给出 "THIS IS A TEST"。如果没有破折号,则返回整个字符串。
<?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
每个 returns 这是一个没有尾随空格的测试
如果您打算使用 explode()
,那么最佳做法是将输出数组中的元素数量限制为 2——因为您只对第一个元素感兴趣。想一想,如果您不打算使用它们,为什么还要在文本中的任何后续连字符上爆炸?
$str = "THIS IS A TEST -0-01-2010 - HELLO WORLD (OKAY)!!";
$parts = explode($str, '-', 2);
$post_title = rtrim($parts[0]);
...但是有两点我不喜欢这种技术:
- 输入是一个字符串,输出也是一个字符串,但是您在整个过程中填充了一个数组,并且
- 看看你必须如何采取额外的步骤来清除标题末尾的任何残留空间
出于这个原因,我建议使用 preg_replace()
直接 trim 不需要的字符,而不生成任何数组,也不需要任何额外的清理。
代码:(PHP Demo) (Pattern Demo)
$str = "THIS IS A TEST -0-01-2010 - HELLO WORLD (OKAY)!!";
var_export(preg_replace('~ *-.*~', '', $str));
输出:
'THIS IS A TEST'
该模式表示,匹配零个或多个空格,后跟第一个出现的连字符,然后匹配零个或多个字符,直到 line/string.
结束