简体   繁体   English

在PHP中检查字符串数组中的子字符串

[英]Check substring in string array in PHP

I am a little be a newbie in PHP (I have much experience in other programming languages like C# etc). 我是PHP的新手(我在C#等其他编程语言方面有很多经验)。 So from experience in OOP, i am almost sure that this can be done also in PHP. 因此,从OOP的经验来看,我几乎可以肯定,这也可以在PHP中完成。 Here is the question and problem. 这是问题。 I am writting script thats going to export some html code. 我正在写脚本多数民众赞成在出口一些HTML代码。 Here is example. 这是例子。 I have folder on server with images of fruits. 我在服务器上有水果图像的文件夹。 For example folder holds next images: strawberry.jpg, apple 1.jpg, apple 2.jpg, peach.jpg, bannana 1.jpg, bannana 2.jpg, pear.jpg. 例如,文件夹包含下一个图像:Strawberry.jpg,Apple 1.jpg,Apple 2.jpg,peach.jpg,bannana 1.jpg,bannana 2.jpg,pear.jpg。 I am already written code thats working perfect but I want to be more advanced 我已经写过可以完美运行的代码,但是我想变得更高级

 <?php $files = glob('./images/fruits/*.*'); foreach($files as $file) { $filename = pathinfo($file); $filepath1 = pathinfo($file, PATHINFO_BASENAME); $filepath2 = "images/logotipi/fruits/".$filepath1; echo '{slider <strong>'.$filename['filename'].'</strong>|blue}'; echo '<br>'; echo '{tip'; echo "<img src=\\"".$filepath2."\\">"; echo '}'; echo "<img src=\\"".$filepath2."\\" "; echo 'width="100" height="100" />{/tip}'; echo '<br>'; } ?> 

So what I want. 所以我想要的。 As you see my output will be 如您所见,我的输出将是

{slider **strawberry**|blue}
{tip <img src="images/fruits/strawberry.jpg" />}<img src="images/fruits/strawberry.jpg" width="100" height="100" />{/tip}
{slider **apple 1**|blue}
{tip <img src="images/fruits/apple 1.jpg" />}<img src="images/fruits/apple 1.jpg" width="100" height="100" />{/tip}
{slider **apple 2**|blue}
{tip <img src="images/fruits/apple 2.jpg" />}<img src="images/fruits/apple 2.jpg" width="100" height="100" />{/tip}

... ...

And etc for each image. 每个图像等等。 I want next i want to my output for each this slider that apple be in that slide for example. 接下来,我想为每个该滑块输出,例如,苹果在该幻灯片中。 I want to my output be like this: 我想要我的输出是这样的:

 {slider **strawberry**|blue}
    {tip <img src="images/fruits/strawberry.jpg" />}<img src="images/fruits/strawberry.jpg" width="100" height="100" />{/tip}
    {slider **apple**|blue}
        {tip <img src="images/fruits/apple 1.jpg" />}<img src="images/fruits/apple 1.jpg" width="100" height="100" />{/tip}
        {tip <img src="images/fruits/apple 2.jpg" />}<img src="images/fruits/apple 2.jpg" width="100" height="100" />{/tip}

... So as you see I want to check names which are strings in string array of filenames. ...如您所见,我想检查文件名字符串数组中的字符串名称。 If i have more categories like apples, or bannanas, the names always end with number 1,2,3 etc. How can be done in php? 如果我有更多类别,例如苹果或香蕉,名称总是以数字1,2,3等结尾。如何在php中完成?

You might try to preg_match() the filename to grab the category. 您可以尝试使用preg_match()文件名来获取类别。 You can modify the regular expression to fit your desired pattern. 您可以修改正则表达式以适合所需的模式。

$lastCategory = null;

foreach($files as $file) {

    // adjust this regular expression pattern to fit your needs
    preg_match("/(\w+)\s\d.\w+/", $file, $matches);
    $filename = $matches[0];
    $category = $matches[1];

    // do we have a new category?
    if ($category !== $lastCategory) {
        echo '{slider <strong>' . $category . '</strong>|blue} <br>';
        $lastCategory = $category;
    }

    echo '{tip <img src="' . $file . '"> }';
    echo '<img src="' . $file . '" width="100" height="100" />';
    echo '{/tip} <br>';  

}

And i doubt that you can adjust the regexp :D So "apple green 1.jpg" -> (\\w+|\\w+\\s\\w+)\\s\\d.\\w+ 而且我怀疑您是否可以调整正则表达式:D所以“ apple green 1.jpg”-> (\\w+|\\w+\\s\\w+)\\s\\d.\\w+

If I understand you want to group your images in the format provide for your slider, that is actually simple, just extract the slider header from the file name and then put it as the key of its array to group the images: 如果我了解您要按照为滑块提供的格式对图像进行分组,那实际上很简单,只需从文件名中提取滑块标题,然后将其作为数组的键来对图像进行分组:

<?
// Serialize data ------------------------------------>
function clearHeader($filename) {
    // Remove extension
    // $rf = pathinfo($file, PATHINFO_BASENAME); # This will not work in my example as I don't have the images
    $rf = explode('.', $filename);
    array_pop($rf);
    $hd = $rf[0];
    // Remove numbers
    $hd = preg_replace('/\s?\d+/', '', $hd);
    // Replace spaces for underscores
    $hd = str_replace(' ', '_', $hd);
    // Return the header name
    return $hd;
}

$files = array('strawberry.jpg','apple 1.jpg','apple 2.jpg','peach.jpg','bannana 1.jpg','bannana 2.jpg','pear.jpg');
/*
// This file iterator is better than glob()
$scan = new RecursiveDirectoryIterator(__DIR__ . '/images/fruits/');
foreach(new RecursiveIteratorIterator($scan) as $file) {
    if(@!is_array(getimagesize($file))){
        $files[] = pathinfo($file)['basename'];
    }
}
*/
foreach ($files as $filename) {
    $slider[ clearHeader($filename) ][] = $filename;
}

// Display data -------------------------------------->
foreach ($slider as $header => $files) {
    $slider_line = array();
    $slider_line[] = "{slider **{$header}**|blue}";
    foreach ($files as $file) {
        $slider_line[] = "{tip <img src=\"images/fruits/{$file}\" />}<img src=\"images/fruits/{$file}\" width=\"100\" height=\"100\" />{/tip}";
    }
    echo implode(PHP_EOL, $slider_line) . PHP_EOL;
}

That would print ( Codepad example ): 可以打印出来( Codepad示例 ):

{slider **strawberry**|blue}
{tip <img src="images/fruits/strawberry.jpg" />}<img src="images/fruits/strawberry.jpg" width="100" height="100" />{/tip}
{slider **apple**|blue}
{tip <img src="images/fruits/apple 1.jpg" />}<img src="images/fruits/apple 1.jpg" width="100" height="100" />{/tip}
{tip <img src="images/fruits/apple 2.jpg" />}<img src="images/fruits/apple 2.jpg" width="100" height="100" />{/tip}
{slider **peach**|blue}
{tip <img src="images/fruits/peach.jpg" />}<img src="images/fruits/peach.jpg" width="100" height="100" />{/tip}
{slider **bannana**|blue}
{tip <img src="images/fruits/bannana 1.jpg" />}<img src="images/fruits/bannana 1.jpg" width="100" height="100" />{/tip}
{tip <img src="images/fruits/bannana 2.jpg" />}<img src="images/fruits/bannana 2.jpg" width="100" height="100" />{/tip}
{slider **pear**|blue}
{tip <img src="images/fruits/pear.jpg" />}<img src="images/fruits/pear.jpg" width="100" height="100" />{/tip}

Use a regular expression to get the part of the filename before the space and number, and compare this to the word saved previously. 使用正则表达式获取文件名中空格和数字之前的部分,并将其与先前保存的单词进行比较。 If it's different, display the {slider ...} header. 如果不同,则显示{slider ...}标头。

$lastfruit = null;
foreach($files as $file) {
    $filename = pathinfo($file);
    $filepath1 = pathinfo($file, PATHINFO_BASENAME);
    $filepath2 = "images/logotipi/fruits/".$filepath1;
    preg_match('#/([^/]+?)(?: \d+)?\.[^/]+$#', $file, $match);
    $fruit = $match[1];
    if ($fruit != $lastfruit) {
        echo '{slider <strong>'.$fruit.'</strong>|blue}';
        echo '<br>';
        $lastfruit = $fruit;
    }
    echo '{tip';
    echo "<img src=\"".$filepath2."\">";
    echo '}';
    echo "<img src=\"".$filepath2."\" ";
    echo 'width="100" height="100" />{/tip}';
    echo '<br>';
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM