Используя str_replace так, чтобы это только действовало на первое соответствие?

Насколько я понимаю, создаваемый плагин зависит от одного из плагинов начальной загрузки с именем yii\bootstrap\Collapse, и для управления любой зависимостью для компонентов начальной загрузки js необходимо добавить эту зависимость в свой файл assetManager.

Как я справлюсь с этим, я помещу пользовательский код в файл js и внесу его в переменную $js в AssetBundle, а затем добавлю зависимость от yii\bootstrap\BoottrapPluginAsset, чтобы мой файл js с Пользовательский код всегда загружается после js-файла загрузочного плагина.

См. Приведенный ниже класс с одним файлом CSS и файлом test.js, в котором будет написан пользовательский код

class AppAsset extends AssetBundle
{
    /**
     * @var string
     */
    public $basePath = '@webroot';
    /**
     * @var string
     */
    public $baseUrl = '@web';
    /**
     * @var array
     */
    public $css = [
        'css/site.css',
    ];
    /**
     * @var array
     */
    public $js = [
        'js/test.js',
    ];

    /**
     * @var array
     */
    public $depends = [
        'yii\web\YiiAsset',
        'yii\bootstrap\BootstrapAsset',
        'yii\bootstrap\BootstrapPluginAsset',
    ];
}

. После того, как вы выполнили все настройки, как описано выше, зарегистрируйте актив. файл в макете, а затем просмотреть источник, вы увидите файлы, загруженные, как показано ниже, где test.js будет всегда загружаться после bootstrap.js файла

enter image description here [1113 ]

301
задан JakeGould 7 May 2014 в 04:51
поделиться

7 ответов

Можно сделать с помощью preg_replace :

function str_replace_first($from, $to, $content)
{
    $from = '/'.preg_quote($from, '/').'/';

    return preg_replace($from, $to, $content, 1);
}

echo str_replace_first('abc', '123', 'abcdef abcdef abcdef'); 
// outputs '123def abcdef abcdef'

Магия заключается в необязательном четвертом параметре [Limit]. Из документации:

[Лимит] - максимально возможное замены для каждого шаблона в каждом строка темы. По умолчанию -1 (нет предел).


Тем не менее, см. ответ зомбата для более эффективного метода (примерно в 3-4 раза быстрее).

320
ответ дан 23 November 2019 в 01:25
поделиться

Для решения

<?php
echo replaceFirstMatchedChar("&", "?", "/property/details&id=202&test=123#tab-6");

function replaceFirstMatchedChar($searchChar, $replaceChar, $str)
{
    for ($i = 0; $i < strlen($str); $i++) {

        if ($str[$i] == $searchChar) {
            $str[$i] = $replaceChar;
            break;
        }
    }
    return $str;
}
для цикла
0
ответ дан 23 November 2019 в 01:25
поделиться
$str = "/property/details&id=202&test=123#tab-6p";
$position = strpos($str,"&");
echo substr_replace($str,"?",$position,1);

Используя substr_replace мы можем заменить возникновение первого символа только в строке. как & повторяется многократно, но только в первом положении мы должны заменить & с?

1
ответ дан 23 November 2019 в 01:25
поделиться

Самый простой способ - использовать регулярное выражение.

Другой способ - найти позицию строки с помощью strpos (), а затем substr_replace ()

Но я бы действительно используйте RegExp.

3
ответ дан 23 November 2019 в 01:25
поделиться

К сожалению, я не Я не знаю ни одной функции PHP, которая может это сделать.
Вы можете довольно легко свернуть свой собственный, вот так:

function replace_first($find, $replace, $subject) {
    // stolen from the comments at PHP.net/str_replace
    // Splits $subject into an array of 2 items by $find,
    // and then joins the array with $replace
    return implode($replace, explode($find, $subject, 2));
}
54
ответ дан 23 November 2019 в 01:25
поделиться

Его версии нет, но решение совсем не взломанное.

$pos = strpos($haystack, $needle);
if ($pos !== false) {
    $newstring = substr_replace($haystack, $replace, $pos, strlen($needle));
}

Довольно просто и сохраняет снижение производительности регулярных выражений.


Бонус: если вы хотите заменить последним вхождением,

558
ответ дан 23 November 2019 в 01:25
поделиться

Изменить: оба ответа были обновлены и теперь верны. Я оставлю ответ, так как тайминги функции все еще полезны.

К сожалению, ответы «зомбат» и «слишком много php» неверны. Это пересмотр опубликованного ответа зомбата (так как у меня недостаточно репутации, чтобы оставить комментарий):

$pos = strpos($haystack,$needle);
if ($pos !== false) {
    $newstring = substr_replace($haystack,$replace,$pos,strlen($needle));
}

Обратите внимание на strlen ($ Need) вместо strlen ($ replace). Пример зомбата будет работать правильно, только если игла и замена имеют одинаковую длину.

Здесь та же функциональность в функции с той же сигнатурой, что и у PHP str_replace:

function str_replace_first($search, $replace, $subject) {
    $pos = strpos($subject, $search);
    if ($pos !== false) {
        return substr_replace($subject, $replace, $pos, strlen($search));
    }
    return $subject;
}

Это исправленный ответ на «слишком много php»:

implode($replace, explode($search, $subject, 2));

Обратите внимание на 2 в конце вместо 1. Или в функции format:

function str_replace_first($search, $replace, $subject) {
    return implode($replace, explode($search, $subject, 2));
}

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

93
ответ дан 23 November 2019 в 01:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: