php: получить заголовок, а затем добавить либо 's, либо просто', если заголовок заканчивается уже в [duplicate]

A NullReferenceException бросается, когда мы пытаемся получить доступ к свойствам нулевого объекта или когда значение строки становится пустым, и мы пытаемся получить доступ к строковым методам.

Например:

  1. При использовании метода string пустой строки:
    string str = string.Empty;
    str.ToLower(); // throw null reference exception
    
  2. Когда свойство нулевого объекта доступно:
    Public Class Person {
        public string Name { get; set; }
    }
    Person objPerson;
    objPerson.Name  /// throw Null refernce Exception 
    
373
задан sepehr 21 April 2010 в 11:28
поделиться

10 ответов

substr("testers", -1); // returns "s"
773
ответ дан Rich Adams 26 August 2018 в 13:25
поделиться
  • 1
    Если вы используете многобайтовые кодировки символов, такие как UTF-8, вместо этого используйте mb_substr ( php.net/mb_substr ). – Gumbo 21 April 2010 в 11:19
  • 2
    так много для моего substr ($ string, strlen ($ string) -1, 1) ;. Кажется, я сделал ДОЛГО! – jeffkee 20 March 2014 в 00:58
  • 3
    Вам нужны только многобайтовые строковые функции, если строка оценивается как двоичная строка. Aka, когда php не знает кодировку. В противном случае типичные не многобайтовые строковые функции будут работать отлично. – Ray Foss 16 March 2015 в 18:50

В верхнем и следующем PHP 7.1 вы сможете это сделать ( Принято rfc для отрицательных смещений строки ):

<?php
$silly = 'Mary had a little lamb';
echo $silly[-20];
echo $silly{-6};
echo $silly[-3];
echo $silly[-15];
echo $silly[-13];
echo $silly[-1];
echo $silly[-4];
echo $silly{-10};
echo $silly[-4];
echo $silly[-8];
echo $silly{3};
die();

Я позволю вам угадать output.

Кроме того, я добавил это в код производительности xenonite с этими результатами:

substr () взял 7.0334868431091seconds

занял 2,3111131191254 секунд

Прямой доступ к строке занял 1.7971360683441 секунд

21
ответ дан Community 26 August 2018 в 13:25
поделиться
  • 1
    Преднамеренно ошибочно ... – RyanNerd 12 March 2016 в 01:57
  • 2
    Удивительная особенность! – Slowaways 6 November 2016 в 19:01
  • 3
    Спасибо за отправку тестов! Если кто-то интересуется критериями C # для выполнения того же, эта страница является хорошим чтением. Прямой доступ к последнему персонажу выиграл. – WorkRelated 7 June 2017 в 01:28

Вы можете найти последний символ, используя php, многими способами, такими как substr () и mb_substr () .

Если вы используете многобайтовые кодировки символов, такие как UTF-8, используйте mb_substr вместо substr

Здесь я могу показать вам оба примера:

<?php
    echo substr("testers", -1);
    echo mb_substr("testers", -1);
?>

LIVE DEMO

1
ответ дан Faisal 26 August 2018 в 13:25
поделиться

Помните, что если у вас есть строка, которая была прочитана как строка из текстового файла с использованием функции fgets(), вам нужно использовать substr($string, -3, 1), чтобы вы получили фактический символ, а не часть CRLF (возврат каретки Line Feed).

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

3
ответ дан FastTrack 26 August 2018 в 13:25
поделиться

Или через прямой доступ к строке :

$string[strlen($string)-1];

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

С PHP 7.1.0 также поддерживаются отрицательные числовые индексы, например, просто $string[-1];

57
ответ дан Gordon 26 August 2018 в 13:25
поделиться
  • 1
    Мне нравится этот ответ в стиле C, я задаюсь вопросом, почему у этого есть только несколько минусов. – Valentin Mercier 19 June 2014 в 17:04
  • 2
    @ValentinMercier: Потому что это вопрос PHP, а не C. – Martin Thoma 19 July 2014 в 20:28
  • 3
    Программисты @ValentinMercier ... и только C имеют конкурс для запутывания кода! ioccc.org – Slashback 8 November 2015 в 03:49
  • 4
    @ Слайдбек о своих привычках тоже;) Я лично люблю стиль С;) – Gall Annonim 22 June 2017 в 13:41
  • 5
    Я думаю, что это лучшее решение, потому что оно позволяет вам изменять характер, тогда как решение substr, приведенное выше, не имеет. – cazort 19 August 2017 в 15:16
substr($string, -1) 
57
ответ дан knittl 26 August 2018 в 13:25
поделиться
  • 1
    Там нет функции PHP под названием «подстрока», вы получите сообщение об ошибке, если не сделали свою собственную функцию подстроки. Должен быть "substr". – Rich Adams 21 April 2010 в 10:52
  • 2
    ах, ты портишь всю шутку. +8 голосования за неправильный ответ выглядит просто потрясающе :) – Your Common Sense 21 April 2010 в 10:56
  • 3
    duh ..., я имел в виду substr, конечно – knittl 21 April 2010 в 11:12

Строка на разных языках, включая C sharp и PHP, также считается массивом символов.

Зная, что в теории операции массива должны быть быстрее, чем строковые, которые вы могли бы сделать,

$foo = "bar";


$lastChar = strlen($foo) -1;
echo $foo[$lastChar];

$firstChar = 0;
echo $foo[$firstChar];

Однако стандартные функции массива, такие как

count();

, не будут работать с строкой.

1
ответ дан Petar Atanasov 26 August 2018 в 13:25
поделиться

Я не могу оставлять комментарии, но в отношении ответа FastTrack также помните, что окончание строки может быть только одиночным символом. Я предлагаю

substr(trim($string), -1)

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

trim (или rtrim) удалит все пробелы, так что если вам нужно проверить пробел, вкладку или другие пробелы, вручную сначала заменить различные окончания строк:

$order = array("\r\n", "\n", "\r");
$string = str_replace($order, '', $string);
$lastchar = substr($string, -1);
15
ответ дан Slashback 26 August 2018 в 13:25
поделиться

Я бы посоветовал пойти на решение Гордона, поскольку он более эффективен, чем substr ():

<?php 

$string = 'abcdef';
$repetitions = 10000000;

echo "\n\n";
echo "----------------------------------\n";
echo $repetitions . " repetitions...\n";
echo "----------------------------------\n";
echo "\n\n";

$start = microtime(true);
for($i=0; $i<$repetitions; $i++)
    $x = substr($string, -1);

echo "substr() took " . (microtime(true) - $start) . "seconds\n";

$start = microtime(true);
for($i=0; $i<$repetitions; $i++)
    $x = $string[strlen($string)-1];

echo "array access took " . (microtime(true) - $start) . "seconds\n";

die();

выводит что-то вроде

 ---------------------------------- 
 10000000 repetitions...
 ----------------------------------

 substr() took 2.0285921096802seconds 
 array access took 1.7474739551544seconds
4
ответ дан Xenonite 26 August 2018 в 13:25
поделиться
  • 1
    Это должно быть комментарий к ответу Гордона. – Goose 23 November 2015 в 21:42
  • 2
    Можете подтвердить это. Чем длиннее ваша строка, тем больше разница в производительности. В моем тесте с 10 символами substr примерно на 20% медленнее – Philipp 29 February 2016 в 22:09
  • 3
    Не удивительно, поскольку substr () имеет накладные расходы на вызов функции, а другой - «C like» прямая манипуляция строками. BTW Я запускал этот код на PHP 7.1-dev с результатами: substr () взял 7.090255022049seconds \ доступ к массиву занял 2.3145787715912seconds – RyanNerd 12 March 2016 в 01:10

Siemano, получить только файлы php из выбранного каталога:

$dir    = '/home/zetdoa/ftp/domeny/MY_DOMAIN/projekty/project';
$files = scandir($dir, 1);


foreach($files as $file){
  $n = substr($file, -3);
  if($n == 'php'){
    echo $file.'<br />';
  }
}
-1
ответ дан ZMORA PROSTO Z KRZOKA 26 August 2018 в 13:25
поделиться
Другие вопросы по тегам:

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