Несколько вызовов preg_replace изменяет результат - PullRequest
0 голосов
/ 27 марта 2010

У меня есть группа файлов, которые были названы в несколько стандартном формате. Стандартная форма в основном это:

[целое число] _word1_word2_word3_ ... _wordn, где слово может быть чем угодно, но все слова разделяются подчеркиванием.

На самом деле я хочу сделать только три вещи в тексте:

1.) Я хочу изменить целое число, которое всегда в начале, чтобы что-то вроде «200» стало бы $ 200,00.

2.) Заменить любые "слова" в форме "на", "с", "w /" или "W /" на "на".

3.) Замените все подчеркивания пробелом.

Я написал три разных вызова preg_replace, чтобы сделать трюк. Они следующие:

1.) $filename = preg_replace("/(^[0-9]+)/","$ $1.00",$filename)

2.) $filename = preg_replace("/_([wW]|[wW]ith)_/"," with ",$filename)

3.) $filename = preg_replace("/_/"," ",$filename);

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

Спасибо за помощь!

Обновление:

Вот фактический код, с которым я работаю:

$path = "./img";
$dir_handle = @opendir($path);
while ($file = readdir($dir_handle)) {
    if ($file != "." && $file != "..") {
        $id = preg_replace("/\.jpg/","",$file);
        $id = preg_replace("/(^[0-9]+)/","$ $1.00", $id);
        $id = preg_replace("/_([wW]\/|[wW]ith)_/"," with ", $id);
        $id = preg_replace("/_/"," ", $id);
        echo "<a href='javascript:show(\"img/$file\")'>$id</a> <br/>";
    }
}
closedir($dir_handle);

1 Ответ

2 голосов
/ 27 марта 2010

Нечто подобное может произойти, если первая замена удалит некоторый текст, которому соответствует вторая замена. Но я не думаю, что это то, что здесь происходит. Я думаю, что у вас просто ошибка во второй замене. Похоже, вам не хватает /:

$filename = preg_replace("/_([wW]\/|[wW]ith)_/"," with ", $filename);

После этого изменения все работает нормально:

$filename = "200_word1_w/_word2";
$filename = preg_replace("/(^[0-9]+)/","$ $1.00", $filename);
$filename = preg_replace("/_([wW]\/|[wW]ith)_/"," with ", $filename);
$filename = preg_replace("/_/"," ", $filename);
print_r($filename);

Результат:

$ 200.00 word1 with word2
...