Насколько я понимаю, создаваемый плагин зависит от одного из плагинов начальной загрузки с именем 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
файла
Можно сделать с помощью 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 раза быстрее).
Для решения
<?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;
}
для цикла $str = "/property/details&id=202&test=123#tab-6p";
$position = strpos($str,"&");
echo substr_replace($str,"?",$position,1);
Используя substr_replace мы можем заменить возникновение первого символа только в строке. как & повторяется многократно, но только в первом положении мы должны заменить & с?
Самый простой способ - использовать регулярное выражение.
Другой способ - найти позицию строки с помощью strpos (), а затем substr_replace ()
Но я бы действительно используйте RegExp.
К сожалению, я не Я не знаю ни одной функции 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));
}
Его версии нет, но решение совсем не взломанное.
$pos = strpos($haystack, $needle);
if ($pos !== false) {
$newstring = substr_replace($haystack, $replace, $pos, strlen($needle));
}
Довольно просто и сохраняет снижение производительности регулярных выражений.
Бонус: если вы хотите заменить последним вхождением,
Изменить: оба ответа были обновлены и теперь верны. Я оставлю ответ, так как тайминги функции все еще полезны.
К сожалению, ответы «зомбат» и «слишком много 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));
}
Я рассчитал время для двух функций, и первая из них в два раза быстрее, если совпадений не найдено. Они имеют одинаковую скорость при обнаружении совпадения.