code_junkie

Need a regex to add css class to first and last list item

Nov 12th, 2011
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.72 KB | None | 0 0
  1. $patterns = array('/<ul+([^<]*)<li/m', '/<([^<]*)(?<=<li)(.*)</ul>/s');
  2. $replace = array('<ul$1<li class="first"','<li class="last"$2$3</ul>');
  3. $navigation = preg_replace($patterns, $replace, $navigation);
  4.  
  5. $(document).ready(
  6. function() {
  7. $('#id-of-ul:firstChild').addClass('first');
  8. $('#id-of-ul:lastChild').addClass('last');
  9. }
  10.  
  11. );
  12.  
  13. $patterns = array('/<ul+([^<]*)<li/m','/<([^<]*)(?<=<li)(.*)</ul>/s');
  14.  
  15. <?php
  16. $navigation='<ul>
  17. <li>Coffee</li>
  18. <li>Tea</li>
  19. <li>Milk</li>
  20. <li>Beer</li>
  21. <li>Water</li>
  22. </ul>';
  23.  
  24. $patterns = array('/<ul.*?>\s*<li/',
  25. '/<li((.(?<!<li))*?<\/ul>)/s');
  26. $replace = array('$0 class="first"',
  27. '<li class="last"$1');
  28. $navigation = preg_replace($patterns, $replace, $navigation);
  29. echo $navigation;
  30. ?>
  31.  
  32. <ul>
  33. <li class="first">Coffee</li>
  34. <li>Tea</li>
  35. <li>Milk</li>
  36. <li>Beer</li>
  37. <li class="last">Water</li>
  38. </ul>
  39.  
  40. <?php
  41. /**
  42. * Modify list items in pre-rendered html.
  43. *
  44. * Usage Example:
  45. * $replaced_text = ListAlter::addClasses($original_html, array('cool', 'awsome'));
  46. */
  47. class ListAlter {
  48. private $classes = array();
  49. private $classes_found = FALSE;
  50. private $count = 0;
  51. private $total = 0;
  52.  
  53. // No public instances.
  54. private function __construct() {}
  55.  
  56. /**
  57. * Adds 'first', 'last', and any extra classes you want.
  58. */
  59. static function addClasses($html, $extra_classes = array()) {
  60. $instance = new self();
  61. $instance->classes = $extra_classes;
  62. $total = preg_match_all('~<li([^>]*?)>~', $html, $matches);
  63. $instance->total = $total ? $total : 0;
  64. return preg_replace_callback('~<li([^>]*?)>~', array($instance, 'processListItem'), $html);
  65. }
  66.  
  67. private function processListItem($matches) {
  68. $this->count++;
  69. $this->classes_found = FALSE;
  70. $processed = preg_replace_callback('~(w+)="(.*?)"~', array($this, 'appendClasses'), $matches[0]);
  71. if (!$this->classes_found) {
  72. $classes = $this->classes;
  73. if ($this->count == 1) {
  74. $classes[] = 'first';
  75. }
  76. if ($this->count == $this->total) {
  77. $classes[] = 'last';
  78. }
  79. if (!empty($classes)) {
  80. $processed = rtrim($matches[0], '>') . ' class="' . implode(' ', $classes) . '">';
  81. }
  82. }
  83. return $processed;
  84. }
  85.  
  86. private function appendClasses($matches) {
  87. array_shift($matches);
  88. list($name, $value) = $matches;
  89. if ($name == 'class') {
  90. $value = array_filter(explode(' ', $value));
  91. $value = array_merge($value, $this->classes);
  92. if ($this->count == 1) {
  93. $value[] = 'first';
  94. }
  95. if ($this->count == $this->total) {
  96. $value[] = 'last';
  97. }
  98. $value = implode(' ', $value);
  99. $this->classes_found = TRUE;
  100. }
  101. return sprintf('%s="%s"', $name, $value);
  102. }
  103. }
Add Comment
Please, Sign In to add comment