Использование preg_match для получения имени файла - PullRequest
0 голосов
/ 25 июня 2010

Мы используем пользовательский bbcode в наших новостных сообщениях

[newsImage] imageName.jpg [/ newsImage]

И я хотел бы использовать preg_match, чтобы получить imageName.jpg между этимитеги.Весь пост хранится в переменной $ newsPost.

Я новичок в regex, и я просто не могу найти правильное выражение для использования в preg_match, чтобы получить то, что я хочу.

Любая помощь приветствуется.Кроме того, знает ли кто-нибудь из вас хороший ресурс для изучения того, что делают все персонажи в регулярных выражениях?

Ответы [ 4 ]

2 голосов
/ 25 июня 2010
preg_match_all('/\[newsImage\]([^\[]+)\[\/newsImage\]/i', $newsPost, $images);

Переменная $images должна содержать ваш список совпадений.

http://www.php.net/manual/en/regexp.introduction.php

1 голос
/ 25 июня 2010

Как сказал Роб, но избегая последнего]

preg_match('/\[newsImage\]([^\[]+)\[newsImage\]/i', $newsPost, $images);

$ images [1] будет содержать имя файла изображения.

1 голос
/ 25 июня 2010

Чтобы ответить на ваш второй вопрос: очень хороший учебник по регулярным выражениям: регулярные выражения.info .

Помимо прочего, он также содержит ссылку на синтаксис регулярного выражения .

Поскольку различные разновидности регулярных выражений используют разный синтаксис, вам также необходимо просмотреть страницу сравнения регулярных выражений .

0 голосов
/ 25 июня 2010

Это не совсем то, что вы просили, но вы можете заменить свои теги [newsImage] на теги, используя следующий код, он не идеален, так как будет падать, если у вас есть пустой тег, например [newsImage] [/ newsImage]

function process_image_code($text) {
        //regex looks for [newsImage]sometext[/newsImage]
        $urlReg ="/((?:\[newsImage]{1}){1}.{1,}?(?:\[\/newsImage]){1})/i";
        $pregResults = preg_split ($urlReg , $text, -1, PREG_SPLIT_DELIM_CAPTURE);
        $output = "";

        //loop array to build the output string
        for($i = 0; $i < sizeof($pregResults); $i++) {

            //if the array item has a regex match process the result
            if(preg_match($urlReg, $pregResults[$i]) ) {
                $pregResults[$i] = preg_replace ("/(?:\[\/newsImage]){1}/i","\" alt=\"Image\" border=\"0\" />",$pregResults[$i] ,1);

                // find if it has a http:// at the start of the image url
                if(preg_match("/(?:\[newsImage]http:\/\/?){1}/i",$pregResults[$i])) {
                    $pregResults[$i] = preg_replace ("/(?:\[newsImage]?){1}/i","<img src=\"",$pregResults[$i] ,1);
                }else {
                    $pregResults[$i] = preg_replace ("/(?:\[newsImage]?){1}/i","<img src=\"http://",$pregResults[$i] ,1);
                }

                $output .= $pregResults[$i];
            }else {
                $output .= $pregResults[$i];
            }
        }

        return $output;
    }
...