在第一次短划线之前从字符串中提取标题

时间:2016-06-25 20:05:20

标签: php string

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

当前代码:

$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 - HELLO WORLD(OKAY)!!
  • 这是测试 - 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);
    var_dump($variableName);



$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS));
$files = array();
$notAllowedExtension = array('jpg', 'vtr', 'html', 'htm' );

foreach($iterator as $file){

if(!in_array($file->getExtension(), $notAllowedExtension) && !$file->isDir())

//$files[filemtime($file->getPathname())] = $file->getPathname();

$files[] = $file->getPathname();

}

sort($files);

echo "<pre>" . print_r($files, true) . "</pre>";

2 个答案:

答案 0 :(得分:1)

将爆炸()与&#34; - &#34;作为一个分隔符,根据&#34; - &#34;的存在将其分成块。然后取第一部分并使用trim()修剪尾随空格,使标题没有尾随空格。这给了&#34;这是一个测试&#34;在所有提供的测试用例中。如果没有破折号,则返回整个字符串。

<?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

并且每个都返回这是一个没有尾随空格的测试

答案 1 :(得分:0)

如果要使用explode(),则最佳做法是将输出数组中的元素数限制为2个,因为您只对第一个元素感兴趣。想一想,如果您不打算使用它们,为什么还要费心在文本中的后续连字符?

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

...但是关于这项技术,我不喜欢两件事:

  1. 输入是一个字符串,而输出是一个字符串,但是您一直在填充数组,并且
  2. 看看您需要如何采取额外的步骤来清除标题末尾的所有余留空间

出于这个原因,我建议使用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'

模式说,匹配零个或多个空格,后跟第一个出现的连字符,然后匹配零个或多个字符,直到行/字符串的结尾。