删除字符串后的文本

时间:2011-12-09 18:47:40

标签: php substring

这是我的链接

<img src='http://www.example.org/images/post_images/2400.jpg' /><div>© Ham Sammich</div></div>

我想删除/>之后的文字,从而制作链接..

<img src='http://www.example.org/images/post_images/2400.jpg' />

我尝试在最后使用strstr()函数,但是我的vps没有选择转到php5.3,因此不能使用。

这是我的代码,因为5.3没有在那里而无效..

$imgTwo = strstr($img, ">", 1);
$img = $imgTwo . ">";

什么是以我想要的方式完成这项工作的良好替代品?

3 个答案:

答案 0 :(得分:3)

@ strongonhanRich给出的替代解决方案不涉及正则表达式

$result = array_shift(explode('/>', $string)).'/>';

其中$string是您的字符串,$result是处理结果。

这意味着什么?它说&#34; 将字符串拆分为&#34; /&gt;&#34;并在第一次出现之前返回部分,然后添加&#34; /&gt;&#34;它保存为$ result &#34;。这意味着它完全符合您的要求:)

以下是此实际有效的演示:codepad.org/0TTCypA5

还有以上替代解决方案的替代解决方案:)

$result = substr($string, 0, strpos($string, '/>')+2);

其示范在这里:codepad.org/ifyJiaPB。这个说:&#34; 找到第一次出现的位置&#34; /&gt;&#34;在字符串中并返回之前的所有内容,包括&#34; /&gt;&#34;本身&#34;

答案 1 :(得分:1)

preg_match( '/<img[^>]*>/', $img, $matches);

$ matches [0]将只是img标记。

答案 2 :(得分:0)

strstr()之前的黑暗时间......

以下是一些可能的方法:

代码:(Demo with PHP5.2.17

$string='<img src=\'http://www.example.org/images/post_images/2400.jpg\' /><div>© Ham Sammich</div></div>';

//echo 'strstr: ';
//echo strstr($string,'<div>',true); // not in php5.2

echo "strtok: ";
echo strtok($string,'>'),'>';

echo "\n\nsubstr/strpos: ";
echo substr($string,0,strpos($string,'<div>'));

echo "\n\nexplode no limit: ";
//echo explode('<div>',$string)[0]; // not in php5.2
echo current(explode('<div>',$string));

echo "\n\nexplode limit 2: ";
//echo explode('<div>',$string,2)[0]; // not in php5.2
echo current(explode('<div>',$string,2));

echo "\n\npreg_match: ";
//echo preg_match('/<img[^>]*>/',$string,$out)?$out[0]:$string; // not in php5.2
echo preg_match('/<img[^>]*>/',$string,$out)?current($out):$string;

echo "\n\npreg_split: ";
//echo preg_split('/>\K/',$string,2)[0]; // not in php5.2
echo current(preg_split('/>\K/',$string,2));

echo "\n\npreg_replace: ";
echo preg_replace('/<div>.*/','',$string);

输出:

strtok: <img src='http://www.example.org/images/post_images/2400.jpg' />

substr/strpos: <img src='http://www.example.org/images/post_images/2400.jpg' />

explode no limit: <img src='http://www.example.org/images/post_images/2400.jpg' />

explode limit 2: <img src='http://www.example.org/images/post_images/2400.jpg' />

preg_match: <img src='http://www.example.org/images/post_images/2400.jpg' />

preg_split: <img src='http://www.example.org/images/post_images/2400.jpg' />

preg_replace: <img src='http://www.example.org/images/post_images/2400.jpg' />
  • strstr($string,'<div>',true); - 这可能是最好的调用 - 一个函数调用创建所需的字符串,没有额外的函数调用,没有多余的内存使用/没有连接。
  • strtok($string,'>'),'>' - 这几乎是干净的,但并不完全是因为它只能搜索一个字符,因此我们必须更改目标,然后在最后连接字符。
  • substr($string,0,strpos($string,'<div>')) - 它从字符串生成所需的子字符串,但只需要一次调用就可以进行两次函数调用。
  • current(explode('<div>',$string)) - 这会生成一个无限元素数组,只能访问第一个字符串。这是两个函数调用,并不是很干净,因为它要求完成比必要的更多的工作。
  • current(explode('<div>',$string,2)); - 限制元素比以前的explode方法更好,但同样的原则适用:为什么在只需要字符串时创建一个数组。
  • preg_match('/<img[^>]*>/',$string,$out)?current($out):'failed'; - 无论是preg_match,preg_split,preg_replace等,正则表达式模式都比非正则表达式函数慢得多。对于这种情况,采用正则表达式方法没有任何优势。因此,虽然它只是一个函数调用,但它不会是最有效的方式。

如果您愿意,请执行自己的基准测试,但对于这样一个小字符串,性能将无法与最终用户区分开来。

下一个标准将取决于您。也许你觉得有一种方法比另一种方式更容易阅读,或者你想要一个如果缺少预期的分隔符就不会轻易窒息的功能。